У меня есть несколько RewriteRules в конфигурации Apache VirtualHost. Я хотел бы иметь возможность проверить текущий URL-адрес (после предыдущих перезаписей) на соответствие некоторым условиям. Проблема в том, что переменная% REQUEST_URI устанавливается в начале обработки и не меняется после каждого правила. По этим переменным очень мало документации; есть ли способ использовать RewriteCond для проверки текущего URL-адреса?
Я включил журнал перезаписи, и очевидно, что даже после сопоставления и перезаписи первого RewriteRule% REQUEST_URI по-прежнему имеет значение '/'
#Map '/' and '' to '/home'
RewriteRule ^/?$ /home
#Check for cached page
RewriteCond %{DOCUMENT_ROOT}/system/cache%{REQUEST_URI}.html -f
RewriteRule ^(.+)$ /system/cache/$1.html [QSA,L]
Есть какой-нибудь простой способ добиться этого?
Редактировать: Вот отрывок из RewriteLog, я не думаю, что происходит внутренний подзапрос.
(3) applying pattern '^/?$' to uri '/'
(2) rewrite '/' -> '/home'
(3) applying pattern '^([^.]+)$' to uri '/home'
(4) RewriteCond: input='/var/www/vhosts/example.com/subdomains/demo/rails/public/system/cache/.html' pattern='-f' => not-matched
(3) applying pattern '^.*$' to uri '/home'
(4) RewriteCond: input='/var/www/vhosts/example.com/subdomains/demo/rails/public/system/maintenance.html' pattern='-f' => not-matched
(3) applying pattern '^/(.*)$' to uri '/home'
(4) RewriteCond: input='/home' pattern='!-f' => matched
(2) rewrite '/home' -> 'http://127.0.0.1:8100/home'
(2) forcing proxy-throughput with http://127.0.0.1:8100/home
(1) go-ahead with proxy request proxy:http://127.0.0.1:8100/home [OK]
Вы можете получить доступ к «текущему» URI через обратную ссылку. Из документации RewriteRule ...
TestString - это строка, которая может содержать следующие расширенные конструкции в дополнение к обычному тексту:
- Обратные ссылки RewriteRule: Это обратные ссылки формы
$N
(0 <= N <= 9), которые предоставляют доступ к сгруппированным частям (в скобках) шаблона из RewriteRule, которое подчиняется текущему наборуRewriteCond
условия.
Вы также можете более аккуратно обрабатывать начальную косую черту - URI запроса всегда начинается с /
. (Самый короткий запрос, который вы можете сделать, - GET / HTTP/1.0
.) Решение ...
# Map '/' to '/home'
RewriteRule ^/$ /home
# Check for cached page
RewriteCond %{DOCUMENT_ROOT}/system/cache/$1.html -f
RewriteRule ^/(.+)$ /system/cache/$1.html [QSA,L]
Главный вопрос: не стоит об этом беспокоиться. Да, ваше второе правило не будет соответствовать первоначальному запросу, но вы переписываете его на /home
сгенерирует внутренний подзапрос, который затем будет соответствовать правилу кеширования.
Дополнительный вопрос: мы используем $1
когда мы имеем в виду $1
. :) $0
относится ко всему шаблону, где $1
относится к первой группе захвата (фрагмент в скобках) в совпадении. (Это означает, что ваше второе правило можно так же легко написать RewriteRule .+ /system/cache/$0.html
. Однако люди часто считают это менее очевидным, чем использование явного захвата, как вы.)