2016-06-28 11 views
-1

, пожалуйста, помогите мне найти решение такого поведения, которое очень странно для меня.mod_rewrite правило, но цепочка не оставлена ​​

Вот мой Htaccess

<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteRule  ^emltr\.gif$     aaa.html [L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$       index.php [L,QSA] 
</IfModule> 

Отметьте флаг L, так что я бы сказал, что, когда «GIF» правило подобрано цепь остается. Но это не так.

Запрошенный URL является «emltr.gif»

Если правило и условие «поймать всех» комментируются, то «GIF» правило правильно принято. («aaa.html» не существует, это тест для предотвращения нежелательного кругового поведения.)

Если правило «catch-all» расколото, то IT берется, а не первое правило. Почему второй, а не первый? Или иначе: почему не оставлена ​​цепочка, даже если флаг L, а затем второе правило оценивается?

Спасибо

+0

Вот как работает L, он действительно останавливает повторную итерацию. Вы можете использовать END вместо L, чтобы закончить процесс перезаписи немедленно, когда это правило соответствует – starkeen

ответ

1

Это описано в руководстве L|last

код [L] флаг вызывает mod_rewrite прекратить обработку набора правил. В большинстве случаев это означает, что если правило соответствует, никакие дополнительные правила не будут обработаны.

Если вы используете RewriteRule в файлах .htaccess или в разделах <Directory>, ... Упрощенная форма этого заключается в том, что после того, как правила были обработаны, перезаписанный запрос передается механизму синтаксического анализа URL-адресов, чтобы сделать то, что он может с этим. Вполне возможно, что по мере обработки обработанного запроса файл или раздел .htaccess может быть встречен снова, и, следовательно, набор правил может снова запускаться с самого начала. Чаще всего это произойдет, если одно из правил вызывает перенаправление - внутреннее или внешнее - заставляя процесс запроса начать работу.

Альтернативный флаг [END] может использоваться для завершения не только текущего цикла обработки перезаписи, но и предотвращения последующей последующей обработки перезаписи в контексте для каждого каталога (htaccess). Это не относится к новым запросам, связанным с внешними перенаправлениями.

Короче говоря, если у вас есть переписать правила в файле .htaccess или внутри Directory директивы, то запрос будет обработан снова, если он был переписан этим раундом. Только когда больше не будет переписываться, он остановится.

Смежные вопросы