1

我有一个带有西里尔域名的网站。有一个授权库将用户重定向到登录页面,但 url 不知何故格式错误。

该网站在 CodeIgniter 上,使用的重定向功能是 codeigniter 的标准重定向功能。我做了一些修改,现在看起来像这样

function redirect($uri = '', $method = 'location', $http_response_code = 302)
{
    if ( ! preg_match('#^https?://#ui', $uri))
    {
        $uri = site_url($uri);
    }


    //exit(idn_to_ascii($uri));
    switch($method)
    {
        case 'refresh'  : header("Refresh:0;url=http://".idn_to_ascii($uri));
            break;
        default         : header("Location:http://".idn_to_ascii($uri), TRUE, $http_response_code);
            break;
    }
    exit;
}

idn_to_ascii 函数似乎没有正确编码 UTF url 字符串......

任何人都可以暗示解决方案吗?

代替

http://xn-------63dat7alb0aizbbjcoujt7j3a6e.xn--p1ai/auth/admin/

我明白了

xn-------63dat7alb0aizbbjcoujt7j3a6e.xn--/auth/login-foj4c

有任何想法吗 ?

4

1 回答 1

3

您应该稍微更改您的代码并idn_to_ascii()仅在域部分而不是完整的 url 上使用。

代替:

switch($method)
    {
        case 'refresh'  : header("Refresh:0;url=http://".idn_to_ascii($uri));
            break;
        default         : header("Location:http://".idn_to_ascii($uri), TRUE, $http_response_code);
            break;
    }

你应该使用:

$pos = mb_strpos($uri,'/', null, 'UTF8');

if ($pos === false) { // only domain, no slash here
    $uri = idn_to_ascii($uri);
}
else { // changes only for domain part, rest left unchanged
    $uri = idn_to_ascii(mb_substr($uri,0,$pos, 'UTF-8')).mb_substr($uri,$pos,null, 'UTF-8');
}


switch($method)
    {
        case 'refresh'  : header("Refresh:0;url=http://".$uri);
            break;
        default         : header("Location:http://".$uri, TRUE, $http_response_code);
            break;
    }

编辑

仅用于生成 URL 的测试代码:

<?php

$uri = 'помощь-от-сглаза-и-порчи.рф/auth/admin/';

$pos = mb_strpos($uri,'/', null, 'UTF8');

if ($pos === false) {
    $uri = idn_to_ascii($uri);
}
else {
    $uri = idn_to_ascii(mb_substr($uri,0,$pos, 'UTF-8')).mb_substr($uri,$pos,null, 'UTF-8');
}

echo $uri."<br />";

对此的输出是:xn-------63dat7alb0aizbbjcoujt7j3a6e.xn--p1ai/auth/admin/正如我所料 - 当我将此文本复制到浏览器中时,我再次被重定向到http://помощь-от-сглаза-и-порчи.рф/auth/admin/

于 2014-10-01T18:46:50.550 回答