我有一个西里尔字母域名的网站。有一个授权库可以将用户重定向到登录页面,但是网址会以某种方式被错误地显示。
网站在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
有什么想法吗?
答案 0 :(得分:3)
您应该稍微更改一下代码,并仅在域名部分使用idn_to_ascii()
,而不是在完整网址上使用。{/ p>
而不是:
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;
}
修改强>
仅用于生成网址的测试代码:
<?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/