Apache mod_rewrite,使用RewriteCond中的当前URL

我在Apache VirtualHostconfiguration中有几个RewriteRules。 我想能够testing当前的URL(在重写之前)针对某些条件。 问题在于variables%REQUEST_URI在处理开始时被设置,并且在每个规则之后都不会改变。 关于这些variables的文档很less。 有没有办法使用RewriteCond来testing当前的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是一个string,除了纯文本外,还可以包含下面的扩展结构:

  • RewriteRule反向引用:这是$N (0 <= N <= 9)forms的反向引用,这些反向引用从RewriteRule提供对模式的分组部分(在括号内)的访问,RewriteRule受到当前RewriteCond条件的限制。

您也可以更干净地处理初始斜线 – 请求URI始终以/开头。 (可以做的最短的请求是GET / HTTP/1.0 。)解决scheme是…

 # 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将生成一个内部子请求,然后匹配caching规则。

侧面问题:当我们的意思是$1时,我们使用$1 。 🙂 $0表示整个模式匹配,其中$1表示匹配内的第一个捕获组(括号大块)。 (这意味着你的第二条规则可以像写成RewriteRule .+ /system/cache/$0.html一样简单。人们通常认为这比使用显式捕获更不明显,就像你正在做的那样)。