2014-10-01 2 views
1

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

Веб-сайт находится на 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 функции, кажется, не правильно кодирования URL-адрес строки UTF ...

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

Вместо

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

Я получаю

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

Любые идеи?

ответ

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; 
    } 

EDIT

код теста только для генерации 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/

+0

Я попробую. –

+0

Что-то не так с mb_subst, так как он полностью отключает латинскую часть и всегда меня перенаправляют на корень ... любые идеи почему? –

+0

@ MR.GEWA Я отредактировал свой ответ и поместил образец рабочего кода –

Смежные вопросы