Почему RewriteCond не препятствует обработке RewriteRule? - PullRequest
1 голос
/ 02 марта 2012

В моем файле .conf, используемом для очистки кэша, есть следующее:

<Directory "/www/virtual/site/html/js/">
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^\d+\/(.+)$ $1 [L]
</Directory>

Идея в том, чтобы переписать site.com/js/123456/script.js на site.com./js/script.js

(Перезапись работает просто отлично)

Если я посмотрю на журнал перезаписи, то часть, которую я не понимаю, это то, что она применяет RewriteRule к сценарию послеперенаправление по внутреннему адресу ... Разве %{REQUEST_FILENAME} !-f не должен мешать ему обрабатывать RewriteRule, поскольку файл существует?

Переписать журнал

[rid#2b607f8f2dc8/initial] (3) [perdir /www/virtual/site2/html/js/] add path info postfix: /www/virtual/site2/html/js/1234 -> /www/virtual/site2/html/js/1234/script.js
[rid#2b607f8f2dc8/initial] (3) [perdir /www/virtual/site2/html/js/] strip per-dir prefix: /www/virtual/site2/html/js/1234/script.js -> 1234/script.js
[rid#2b607f8f2dc8/initial] (3) [perdir /www/virtual/site2/html/js/] applying pattern '^\d+\/(.+)$' to uri '1234/script.js'
[rid#2b607f8f2dc8/initial] (2) [perdir /www/virtual/site2/html/js/] rewrite '1234/script.js' -> 'script.js'
[rid#2b607f8f2dc8/initial] (3) [perdir /www/virtual/site2/html/js/] add per-dir prefix: script.js -> /www/virtual/site2/html/js/script.js
[rid#2b607f8f2dc8/initial] (2) [perdir /www/virtual/site2/html/js/] strip document_root prefix: /www/virtual/site2/html/js/script.js -> /js/script.js
[rid#2b607f8f2dc8/initial] (1) [perdir /www/virtual/site2/html/js/] internal redirect with /js/script.js [INTERNAL REDIRECT]
[rid#2b6073eb14a8/initial/redir#1] (3) [perdir /www/virtual/site2/html/js/] strip per-dir prefix: /www/virtual/site2/html/js/script.js -> script.js
[rid#2b6073eb14a8/initial/redir#1] (3) [perdir /www/virtual/site2/html/js/] applying pattern '^\d+\/(.+)$' to uri 'script.js'
[rid#2b6073eb14a8/initial/redir#1] (1) [perdir /www/virtual/site2/html/js/] pass through /www/virtual/site2/html/js/script.js

1 Ответ

2 голосов
/ 03 марта 2012

mod_rewrite (по замыслу) продолжает применять правила перезаписи, пока URL-адрес больше не изменяется.

Таким образом, при первом перезаписи 1234/script.js в script.js при второй попытке применить правило регулярное выражение шаблона не совпадает и script.js «пропускается».

Это способ, которым он должен работать.Иногда это может быть неприятно, но это делает mod_rewrite намного более мощным / полезным.

edit

mod_rewite сначала проверяет шаблон RewriteRule, прежде чем пытаться применитьRewriteCond х.Это сделано для того, чтобы вы могли использовать обратные ссылки $ 0, $ 1 и т. Д. В вашем RewriteCond.После всех RewriteCond он создаст строку подстановки, поэтому он также может использовать обратные ссылки% 0,% 1.и т. д. См. также схему ниже.

Вот почему он попытался применить шаблон перед проверкой, существует ли файл.

apache mod_rewrite flow

...