boost и правила для apache 2.4

Главные вкладки

Аватар пользователя postgres postgres 6 января 2017 в 16:59

У меня Apache 2.4
Поэтому пробую применить правило от Boost

# # Apache 2.4 bug workaround
# # Enables Search from home page https://drupal.org/node/2078595#comment-8724321
# RewriteCond %{REQUEST_METHOD} ^(POST)$
# RewriteCond %{REQUEST_URI} /
# RewriteRule .* / [S=2]

Честно снимаю комменты и обнаруживаю, что все POST запросы приводят к циклическому редиректу,
а иначе и быть не может... правило именно такое: если запрос POST и в составе REQUEST_URI встречается /
то строку запроса меняем на слэш и передаем в обработку мимо кэша...

https://drupal.org/node/2078595#comment-8724321
и дохожу до
https://www.drupal.org/node/2078595#comment-10741064

точно такая ситуация там наблюдается... поставил комменты назад - все работает, но остается вопрос, что имел в виду автор?

Комментарии

Аватар пользователя bsyomov bsyomov 7 января 2017 в 11:08

«и в составе REQUEST_URI встречается /»
REQUEST_URI является /, а не встречается /.
Есть флаг [S=2] - пропуск следующих двух правил. И нет флага [L], т.е. обработка идёт дальше. У вас сохраняется правильный порядок правил ниже? Это важно, для сохранения логики работы.

Т.е. приведённый вами кусок вырван из контекста, и отдельно работать и не должен, так на всякий.

Аватар пользователя postgres postgres 8 января 2017 в 10:47

Если бы "является /" то либо ^/$ либо ="/"
а в таком виде
RewriteCond %{REQUEST_URI} /
/ - это регулярное выражение в правилах perl и это регулярное выражение будет "TRUE" если хотя бы один слэш встречается
поэтому и вопрос собственно не про документацию mod_rewrite, а про мысль автора. Про остальное - все знаю, все там в порядке, поэтому и пишу:
правило меняет на слэш любой url (.*) передает (перепрыгивает) в обработку мимо (правил Boost) кэша (на обычные правила Drupal)
и еще раз - https://www.drupal.org/node/2078595#comment-10741064

Аватар пользователя bsyomov bsyomov 8 января 2017 в 20:16

По регулярке, вы не правы. / строго матчит /. Для слеша в любом месте должно быть что-то типа ^.*/.*$ Проверьте где-нибудь на http://martinmelin.se/rewrite-rule-tester/ например.

Мысль такова: оно ничего не меняет в uri, и передаёт на правила drupal просто пропуская boost - откуда возьмётся циклический редирект-то тогда?
Может в дело вмешивается какой-нибудь global redirect уже на стороне Dupal?

Аватар пользователя postgres postgres 8 января 2017 в 23:34

Вот я тоже первым делом убрал из глобал редирект правило "убрать конечный слэш", но ситуация не изменилась.
Кто еще правила может писать?
По поводу прав-не-прав - да проверить то просто как угодно, вот так например:
perl -e "print '/bla/bla/bla =~ /\//';"
perl -e "print '/bla/bla/bla =~ /^\/$/';"

но хорошо, схожу проверюсь Smile

Но однако у RewriteCond и RewriteRule синтаксис разный Smile

Аватар пользователя postgres postgres 9 января 2017 в 10:36

bsyomov, не сочти за занудство,
но RewriteCond %{REQUEST_URI} /
работает в полном соответствии с документацией:
http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#rewritecond
хороший перевод на русском здесь например:
http://htaccess.net.ru/doc/mod_rewrite/RewriteCond.php

проверка на практике - добавьте после RewriteBase /
укороченный вариант обсуждаемого выражения и любой запрос (если в нем есть слэш) будет перенапрвлен на этот сайт:

RewriteCond %{REQUEST_URI} /
RewriteRule .* http://drupal.ru [L,R=301]

В варианте ниже перенаправление будет происходить только с главной страницы
RewriteCond %{REQUEST_URI} ^/$ # или так =/ или так ="/"
RewriteRule .* http://drupal.ru [L,R=301]

вариант с применением знака "=" более предпочтителен поскольку идет обычное сравнение строк, без машинки регулярных выражений
regs нужны там, где нужны "захваты" и где собственно присутствует регулярность

Аватар пользователя bsyomov bsyomov 13 января 2017 в 3:04

Тогда, по логике, автор того коммента, сделал ту же ошибку что и я, или просто забыл = добавить.
Суть-то была в пропуске правил именно для главной.