помогите разрулить правило .htaccess

E
На сайте с 23.12.2010
Offline
7
833

Здравствуйте!

хочу избавится от дублей типа

http://site/?vm=

http://site/index.php?vm=

и свестих ко второму варианту

пишу правило (ну и вариации уже всякие перепробывал)

RewriteCond %{THE_REQUEST} /\?vm=
RewriteRule ^/?vm=(.*)$ http://site/index.php?vm=$1 [R=301,L]

а редиректа не наблюдается, подскажите пожалуйста где я ошибаюсь?

Лучшее - враг хорошего! Мое хобби - Irrlicht 3d engine (http://www.irrlicht.ru).
[Удален]
#1

RewriteCond %{QUERY_STRING} vm=(.*)

RewriteRule ^$ http://loc/index.php?vm=%1 [R=301,L]

Хотя может и так подойдет:

RewriteRule ^$ /index.php [R=301,L]

[Удален]
#2

Попробуйте так:

RewriteCond %{REQUEST_URI} ^/vm\=(.+)$

RewriteRule ^(.+)$ /index.php?vm=%1 [L]

Bitman
На сайте с 05.07.2009
Offline
112
#3

Знак вопроса, случаем, не надо подсекать слешем?

Bitman добавил 06.11.2011 в 18:08

А не... всё сложнее. ТС, так вообще не выйдет:

При обработке правил, записанных в .htaccess, Apache работает только с тем, что имеется ДО знака вопроса. Сам символ "?" и все, что находится после него, обработчик просто-напросто не видит.

Редирект надо писать в заголовках php.

Северный лес (https://euro-vagonka.by) DREW (https://drew.by) AvtoDrive (https://avtodrive.by)
E
На сайте с 23.12.2010
Offline
7
#4
GizmoKoenig:
RewriteCond %{QUERY_STRING} vm=(.*)
RewriteRule ^$ http://loc/index.php?vm=%1 [R=301,L]

Хотя может и так подойдет:
RewriteRule ^$ /index.php [R=301,L]

работают только эти варианты, но работают несколько нестабильно, я для теста написал так RewriteRule ^$ / , мол косячные урлы рулить на морду, но правило таким макаром уходит в рекурсию

(вариант с одной строкой тоже работает, но редиректит / на /index.php - то не айс)

для меня regexp не новое слово, но ^$ крышу сносит, поясните плиз как модреврайт применяет правило пустой строки к непустой строке да еще выцепляет то, что должно быть записано как (.*) ?

ну и собственно почему не возникает рекурсии в вашей первой паре? условие "vm=(.*)" должно сработать равно как для http://site/?vm= так и для http://site/index.php?vm= вроде как корректнее выглядит /\?vm= (русским языком: запрос без index.php)

Elmigo добавил 06.11.2011 в 20:16

Bitman:
Знак вопроса, случаем, не надо подсекать слешем?

Bitman добавил 06.11.2011 в 18:08
А не... всё сложнее. ТС, так вообще не выйдет:

Редирект надо писать в заголовках php.

подсекать надо, но не уверен на счет следующего утверждения, т.к. %{THE_REQUEST} содержит полную строку запроса, т.е. то что упало в лог, к примеру так "GET /index.php?vm=1 HTTP 1.1", наличие такой переменной теоретически как бы отменяет утверждение хотя бы для RewriteCond.

[Удален]
#5
Elmigo:

ну и собственно почему не возникает рекурсии в вашей первой паре?

Скорее всего, потому, что там стоит буковка L ;)

E
На сайте с 23.12.2010
Offline
7
#6

вроде как L - это "последнее правило" в цепи условий с прерыванем дальнейшей обработки, но вроде в пределах сессии и после перенаправления на новый адрес все правила сначала будут применятся по новой к новому адресу, иначебы у меня не возникло рекурсии в правиле

RewriteCond %{QUERY_STRING} vm=(.*)
RewriteRule ^$ / [R=301,L]

ошибаюсь?

[Удален]
#7

Кстати, насчёт рекурсии. Попробуйте добавить ещё вот это условие, может, поможет:

RewriteCond %{REQUEST_URI} !(index.php)+

[Удален]
#8
Elmigo:
для меня regexp не новое слово, но ^$ крышу сносит, поясните плиз как модреврайт применяет правило пустой строки к непустой строке да еще выцепляет то, что должно быть записано как (.*) ?

потому, что ?vm=111, это уже не uri, а строка запроса.

RewriteRule ^$ отлавливается то, что идет до "?", в данном случае ""

Elmigo:

ну и собственно почему не возникает рекурсии в вашей первой паре? условие "vm=(.*)" должно сработать равно как для http://site/?vm= так и для http://site/index.php?vm= вроде как корректнее выглядит /\?vm= (русским языком: запрос без index.php)

потому, что срабатывает только для $^ , а после редиректа в uri появляется index.php и поэтому RewriteRule ^$ ... не срабатывает

Elmigo:

(вариант с одной строкой тоже работает, но редиректит / на /index.php - то не айс)

Тогда так:

RewriteCond %{QUERY_STRING} !^$

RewriteRule ^$ /index.php [R=301,L]

Словами, наверное, так "если не пустая строка запроса и uri пустой редиректить на /index.php"

E
На сайте с 23.12.2010
Offline
7
#9

>RewriteRule ^$ отлавливается то, что идет до "?", в данном случае ""

допетрил о чем мне хотел сказать Bitman, вам спасибо, ему мои извенения.

Тогда так:
RewriteCond %{QUERY_STRING} !^$
RewriteRule ^$ /index.php [R=301,L]

Словами, наверное, так "если не пустая строка запроса и uri пустой редиректить на /index.php"

да - идеально, спасибо за решение и ликбез! И всем попытавшимся помочь тоже спасибо.

Тема закрыта.

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