Зачем использовать RewriteCond и RewriteRule для проверки условия URL? - PullRequest
6 голосов
/ 02 сентября 2011

Во многих ответах на правило переписывания при тестировании URL-адреса для определенного условия я часто вижу сочетание использования RewriteCond с REQUEST_URI и самого RewriteRule.

Это просто личные предпочтения или естьпричина производительности или просто ясность правил?Все это, на мой взгляд, веские причины;Мне просто интересно, есть ли конкретная причина.

Я знаю, что есть условия, когда RewriteCond является единственным выбором.Меня интересуют случаи, когда RewriteRule также будет работать.Как правило, это более простые правила.

Вот несколько примеров:

ПРИМЕР 1

Этот ответ имеет общую схему, разрешите определенные папки как есть. Режим обслуживания Htaccess разрешает определенные каталоги

# always allow these folders
RewriteCond %{REQUEST_URI} ^/display_me_always [OR]
RewriteCond %{REQUEST_URI} ^/another_folder [OR]
RewriteCond %{REQUEST_URI} ^/even_more_folders
RewriteRule .+ - [L]

Это может быть сделано только с помощью RewriteRule как:

RewriteRule ^/(?:display_me_always|another_folder|even_more_folders) - [L]

(добавлен?: Для не захвата.Я никогда не уверен, будет ли быстрее иметь более простое правило или не записывать его.)

ПРИМЕР 2

Изменив это для более распространенного сценария, перенаправьте определенные папки в другие папки.

RewriteCond %{REQUEST_URI} ^/display_me_always [OR]
RewriteCond %{REQUEST_URI} ^/another_folder [OR]
RewriteCond %{REQUEST_URI} ^/even_more_folders
RewriteRule ^/[^/]+/(.*)$ /other_location/$1 [L]

Это кажется проще только с правилом.

RewriteRule ^/(?:display_me_always|another_folder|even_more_folders)/(.*)$ /other_location/$1 [R=301,NC]

ПРИМЕР 3

Этот ответ имеет общий шаблон, перенаправьте, если он еще не находится в целевом местоположении. Правило Mod Rewrite для перенаправления всех запросов PDF в другое место .Протестируйте папку с помощью RewriteCond, затем протестируйте файл с правилом.

Я вижу, что отрицательное условие гораздо яснее сделать с RewriteCond, но все еще возможно с RewriteRule.

RewriteCond %{REQUEST_URI} !^/web_content/pdf/
RewriteRule ^(.+\.pdf)$ /web_content/pdf/$1 [L]

Это может быть записано как

RewriteRule ^(?!/web_content/pdf/)(.+\.pdf)$ /web_content/pdf/$1 [L]

Ответы [ 2 ]

2 голосов
/ 02 сентября 2011

Одна простая причина: это гораздо проще понять для не-регулярного гуру.

Правило переписывания, которое вы дадите сегодня оператору, ему, возможно, придется изменить через день ... и чем легче будет понять правило, тем больше шансов, что он сам его изучит и больше не будет бежать к этому месту для еще одно небольшое исправление / новое подобное правило.

Да, комбинированное правило быстрее - здесь нет сомнений. Но время, затрачиваемое на перезапись URL-адреса, по-прежнему так мало по сравнению с выполнением одного скрипта ... что оно может иметь значение только для очень-очень загруженных процессорных серверов и когда таких перезаписей много.

Таким образом, наиболее оптимальным будет что-то среднее между - которое все еще легко читается и одновременно компактно и эффективно. Вместо

# always allow these folders
RewriteCond %{REQUEST_URI} ^/display_me_always [OR]
RewriteCond %{REQUEST_URI} ^/another_folder [OR]
RewriteCond %{REQUEST_URI} ^/even_more_folders
RewriteRule .+ - [L]

предложение

# always allow these folders
RewriteCond %{REQUEST_URI} ^/(display_me_always|another_folder|even_more_folders)
RewriteRule .+ - [L]

Вы не можете стать мастером за день или два (если, может быть, вы не какой-то гений) - все требует времени. И чем больше у вас практического опыта (если вы сами измените эти правила), тем лучше вам двигаться дальше, чтобы выработать более эффективное / стабильное правило.

КСТАТИ: Это правило не будет работать, если помещено в .htaccess (URL в соответствующем шаблоне начинается без косой черты):

RewriteRule ^/(?:display_me_always|another_folder|even_more_folders) - [L]

Но будет работать нормально, если поместить его в контекст конфигурации сервера / виртуального хоста - это один из «нюансов», которые вам нужно знать.

0 голосов
/ 02 сентября 2011

В целом, я бы сказал, что вы правы: RewriteCond действительно в основном для использования с соответствующими элементами ДРУГОЕ, чем REQUEST_URI. Я ожидаю, что в большинстве случаев вы смотрите на случаи в .htaccess. Из spec :

Если вы хотите сопоставить полный URL-путь в RewriteRule для каждого каталога (htaccess), используйте переменную% {REQUEST_URI} в RewriteCond.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...