[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Редирект через php и htaccess
Icewind
Доброго времени!

В вопросах php пока разбираюсь плохо. Возникла необходимость сделать редирект, но, как оказалось, средствами .htaccess сделать это проблематично, поэтому сделал связку из них. Вроде работает, но это только частные случаи и оказалось, что этого мало.

Суть:
Есть адреса, начинающиеся с site/component/users.
Для них работает правило в htaccess "Redirect 301 /component/users http://site.ru"
Все адреса, в которых есть "site/component/users/profile*" должны отправляться на главную. И вот тут был первый камень, так как есть еще адреса типа : "/component/users/profile?Itemid=*", а хтаксес игнорит знак "?" и он остается хвостом.
Тогда Я дописал в index.php вот такой код:

<?php
$getURI = $_SERVER['REQUEST_URI'];
$newURI = str_replace("?Itemid=101", "", $getURI);
if ($_SERVER['REQUEST_URI'] !== $newURI){
header("HTTP/1.1 301 Moved Permanently");
header("Location: $newURI");
}
?>

Но, как видно, он работает только если после "?Itemid=" стоит 101 (частый случай). Но если менять число, то начинается либо 404, либо путем обрезания кривая строка и ДНС не существует. Подскажите, как решить этот вопрос, чтобы выражение реагировало адекватно на любую информацию после "?Itemid=" ?

Это первая часть вопроса. Вторая:
На этом же куске адреса сидят и вот такие адреса, типа "site/component/users/?view=login&Itemid=170". Срабатывает редирект, и адрес обрезается до вида "site/?view=login&Itemid=170"...
И вот тут у меня уже ступор. Подскажите, как настроить редирект (видно, придется снова через php), чтобы адреса, содержащие "?view=login&Itemid=*" уже переадресовывать на другую страницу, а не на главную, как это было выше? То есть должен работать редирект для обоих примеров, но в зависимости от ситуации (profile или ?view=login) отрабатывать по разному...

Заранее благодарен за подсказки!
killer8080
Icewind
здесь не нужен php, всё можно сделать через .htaccess
типа такого

RewriteEngine On

RewriteRule component/users http://site.ru [L,R=301]

RewritCond ${QUERY_STRING} view=login&Itemid
RewriteRule ^site/component/users/?$ http://site.ru/another/url [L,R=301]

RewriteRule ^site/component/users/profile/?$ http://site.ru [L,R=301]



PS код написан на коленке, может быть не корректныv, но общая идея должна быть ясна
Icewind
killer8080
Ваш способ работает, и даже пользовал его.
Но, когда строка будет иметь вид
"/component/users/profile?Itemid=101"
то
"/component/users/profile"
удалится, но хвост "?Itemid=101" останется, если не будет обработки через php. И будет отображаться вот такая ерунда:
"site/?Itemid=101"
Именно эту проблему решал php код. Но если ссылка будет иметь вместо "?Itemid=101", например "?Itemid=102", то она выдает 404 с 301 редиректом, что уже не плохо. Тут надо допилить php код так, чтобы он учитывал всевозможные варианты чисел после =. Что мне пока не понятно как...

RewritCond ${QUERY_STRING} view=login&Itemid
RewriteRule ^site/component/users/?$ http://site.ru/another/url [L,R=301]

Этот блок вообще выбрасывает 500 ошибку...

Если что, то это СМS джумла, куча кривых дублей, которые теперь надо как-то перенаправлять...
killer8080
Цитата (Icewind @ 26.11.2017 - 23:32)
удалится, но хвост "?Itemid=101" останется

обрезается символом "?" в урл редиректа
Цитата (Icewind @ 26.11.2017 - 23:32)
Этот блок вообще выбрасывает 500 ошибку...

там две ошибки было
так попробуй
RewriteEngine On

RewriteRule ^component/users$ http://%{HTTP_HOST}/? [L,R=301]

RewriteCond %{QUERY_STRING} view=login&Itemid
RewriteRule ^site/component/users/?$ http://%{HTTP_HOST}/another/url? [L,R=301]

RewriteRule ^site/component/users/profile/?$ http://%{HTTP_HOST}/? [L,R=301]
Icewind
killer8080
Благодарю за помощь, все равно оставались хвосты. Возможно, это проблема движка, так как оказывается много кто сталкивается с такой проблемой. Но решил задачу другим способом, более костыльным и без PHP.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.