Редирект с кириллических Тегов на urlencode [DLE]

D2
На сайте с 05.10.2010
Offline
32
2065

Всем привет.

Столкнулся с такой проблемой, что нужно было с кириллических тегов сделать редирект на urlencode [DLE], так как по сути это две одинаковые страницы, на urlencode я могу менять титлы и вставлять описание, а на кириллице нет.

Нашел на этом форуме решение:

в engine.php после этой строки: $tag = iconv( "UTF-8", "windows-1251//IGNORE", $tag );

добавил это:

header('Location: '.$config['http_home_url'].'tags/'.urlencode($tag).'/', true, 301);

exit;

После этого все теги автоматически стали переводятся на urlencode, и недоступны более на кириллице, но если есть тег на английском языке, то происходит "циклическая переадресация".

Подскажите, пожалуйста, возможно ли исправить эту проблему, но чтобы по прежнему все теги с кириллицы, перенаправлялись на urlencode?

siv1987
На сайте с 02.04.2009
Offline
427
#1

Как вариант, строчку $tag = iconv( "UTF-8", "windows-1251//IGNORE", $tag );

Заменить на


$utf8Tag = $tag;
$tag = iconv( "UTF-8", "windows-1251//IGNORE", $tag );

if(preg_match("/[\xd0\xb0-\xd1\x8f\xd0\x90-\xd0\xaf]/u", $utf8Tag)){
header('Location: '.$config['http_home_url'].'tags/'.urlencode($tag).'/', true, 301);
exit;
}

Более правильно наверное будет заюзать такую вот функцию, так как в utf8 может быть не только символьный класс /[а-я]/i

где-то в functions.php добавить


function isUTF8($str){
/*
* @see http://en.wikipedia.org/wiki/UTF-8#Description
*/
# Four-byte chars
if(preg_match("/([\360-\364])([\200-\277])([\200-\277])([\200-\277])/", $str))
return true;

/* Three byte chars */
if(preg_match("/([\340-\357])([\200-\277])([\200-\277])/", $str))
return true;

/* Two byte chars */
if(preg_match("/([\300-\337])([\200-\277])/", $str))
return true;

return false;
}

строчку $tag = iconv( "UTF-8", "windows-1251//IGNORE", $tag );

заменить на


$utf8Tag = $tag;
$tag = iconv( "UTF-8", "windows-1251//IGNORE", $tag );

if(isUTF8($utf8Tag)){
header('Location: '.$config['http_home_url'].'tags/'.urlencode($tag).'/', true, 301);
exit;
}
D2
На сайте с 05.10.2010
Offline
32
#2
siv1987:
Как вариант, после этой строки $tag = iconv( "UTF-8", "windows-1251//IGNORE", $tag );
Добавить

if(preg_match("/[\xd0\xb0-\xd1\x8f\xd0\x90-\xd0\xaf]/u", $str)){
header('Location: '.$config['http_home_url'].'tags/'.urlencode($tag).'/', true, 301);
}

Не помогло, кириллические теги не переводит в urlencode, просто исчезла циклическая переадресация.

siv1987
На сайте с 02.04.2009
Offline
427
#3
Damon24:
Не помогло, кириллические теги не переводит в urlencode, просто исчезла циклическая переадресация.

Я с именем переменной немного ошибся, еще раз скопируйте код

D2
На сайте с 05.10.2010
Offline
32
#4

Нет, не первый не второй способ не переводит теги в urlencode(

siv1987
На сайте с 02.04.2009
Offline
427
#5

Вообщето да, нужно не добавлять, а заменить


$tag = iconv( "UTF-8", "windows-1251//IGNORE", $tag );

на


$utf8Tag = $tag;
$tag = iconv( "UTF-8", "windows-1251//IGNORE", $tag );

if(preg_match("/[\xd0\xb0-\xd1\x8f\xd0\x90-\xd0\xaf]/u", $utf8Tag)){
header('Location: '.$config['http_home_url'].'tags/'.urlencode($tag).'/', true, 301);
exit;
}

Во втором способе аналогично. Добавляем $utf8Tag = $tag; и в условие заменяем $tag на $utf8Tag

и exit; после header не забудьте

D2
На сайте с 05.10.2010
Offline
32
#6

Теперь все работает отлично, и первый и второй способ. Спасибо за помощь!)

siv1987
На сайте с 02.04.2009
Offline
427
#7

Вот это это еще

preg_match("/[\xd0\xb0-\xd1\x8f\xd0\x90-\xd0\xaf]/u", $utf8Tag)

можно заменить на

preg_match("/[\300-\337][\200-\277]/", $utf8Tag)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий