Назад | Перейти на главную страницу

Apache mod_rewrite, используя текущий URL-адрес в RewriteCond

У меня есть несколько 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. Однако люди часто считают это менее очевидным, чем использование явного захвата, как вы.)