punycode и перенаправление кириллического домена .рф

У меня есть сайт с кириллическим доменным именем. Существует библиотека авторизации, которая перенаправляет пользователя на страницу входа, но URL-адрес каким-то образом неправильно сформирован.

Сайт работает на 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, кажется, неправильно кодируют строку URL UTF …

Кто-нибудь может намекнуть решение?

Вместо

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

я получил

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

Есть идеи ?

1

Решение

Вы должны немного изменить свой код и использовать 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/

3

Другие решения

Других решений пока нет …