Будет ли Apache проверять RewriteRule при каждом запросе, если REQUEST_URI явно не задан в RewriteCond?

Я новичок в Apache Rewrites, так что это, вероятно, простой вопрос (на который не так просто найти прямые ответы).

Итак, у меня есть следующий Rewrite:

RewriteCond %{QUERY_STRING} ^parm=([a-z]+)$ [NC]
RewriteRule ^path/to/some_script.php /simple-url-$1.html? [R=301,L]

Что, по-видимому, работает так, как ожидалось при тестировании:

www.mydomain.com/path/to/some/script.php?parm=foo

правильно 301:

www.mydomain.com/simple-url-foo.html

Однако меня беспокоит то, что без RewriteCond, явно определяющего сценарий, это условие будет проверяться при каждом запросе, независимо от того, относится ли оно к some_script.php..., что приводит к ненужной нагрузке на Apache.

Так ли это? Если это так, у меня возникли проблемы с выяснением того, как использовать REQUEST_URI в этом случае, IE:

RewriteCond %{REQUEST_URI} ^path/to/some_script.php [NC]
RewriteCond %{QUERY_STRING} ^parm=([a-z]+)$ [NC]
RewriteRule ^path/to/some_script.php /simple-url-$1.html? [R=301,L]

Вышеупомянутое, похоже, не работает, и я не уверен, почему. Любые указатели?


person JR.XYZA    schedule 23.08.2013    source источник


Ответы (1)


Короткий ответ: условие %{REQUEST_URI} не нужно.

Добавляя условие, вы просто перемещаете сравнение URI запроса перед строкой запроса. Его все равно будут сравнивать с каждым поступающим запросом. На самом деле это только усугубляет ситуацию, потому что сравнение для some_script.php будет происходить дважды. Один раз в RewriteCond и еще раз в RewriteRule.

И с вашей исходной настройкой не каждый URI запроса проверяется на some_script.php. %{QUERY_SRING} также гарантирует, что сравнение происходит только для тех запросов, которые пришли с параметром запроса parm.

person Ravi K Thapliyal    schedule 23.08.2013
comment
@anubhava Спасибо, приятель. Эй, у меня есть небольшая просьба :) Можете ли вы посетить этот ответ и посмотреть, сможете ли вы найти, почему принятый ответ работает а мой нет. Я оставил Джону Лину вопрос, но он предпочел не отвечать. Это беспокоило меня! Спасибо :) - person Ravi K Thapliyal; 23.08.2013
comment
Конечно, босс, я дам свой ответ через несколько минут после его анализа. - person anubhava; 23.08.2013
comment
@RaviThapliyal Большое спасибо за подсказки! Имея в виду то, что вы сказали, есть ли способ улучшить Rewrite, чтобы оценивать это правило только тогда, когда параметр parm связан с some_script.php? На случай, если есть другие скрипты/страницы с аналогичными именами параметров? - person JR.XYZA; 23.08.2013
comment
@ JR.XYZA, именно это и происходит. %{QUERY_STRING} сначала проверяет, присутствует ли parm, и если да, то проверяет, является ли запрошенный файл some_script.php или нет. Это единственные две проверки, необходимые для срабатывания правила. Не больше и не меньше. - person Ravi K Thapliyal; 24.08.2013