在子目录.htaccess
内的alpha
(从根目录下面的几个目录:http://domain.com/subsite/alpha/.htaccess
)我希望捕获所有文件请求:
http://domain.com/subsite/alpha/images/
并将其重定向到:
http://domain.com/subsite/alpha/img/
我的.htaccess
看起来像这样:
RewriteRule ^images/(.*)$ %{REQUEST_URI}/\.\./\.\./img/$1 [R=302,NC,L]
仅当/images
内没有其他目录时,此方法才有效。我可以让它像root一样工作
RewriteRule ^images/(.*)$ /subsite/alpha/img/$1 [R=302,NC,L]
但我必须手动将其从alpha
更新为beta
,preprod
等。
基本上,我需要一种方法来隔离^
和images/
之间的所有内容。我尝试了一些变化:
RewriteRule ^(.*)images/(.*)$ /$1/img/$2 [R=302,NC,L]
RewriteRule ^(.*)images/(.*)$ ^$1/img/$2 [R=302,NC,L]
但它不起作用,因为.htaccess
位于alpha
,并且不知道它与root之间的内容。因此,在上文中,$1
不是/subsite/alpha
,而是/alpha
和images/
之间的任何内容。
答案 0 :(得分:3)
您可以使用RewriteBase
并使用相对路径:
RewriteEngine On
RewriteBase /subsite/alpha/
RewriteRule ^images/(.*)$ img/$1 [R=302,NC,L]
否则,如果您想避免使用RewriteBase
,请使用此规则生成动态RewriteBase
:
RewriteEngine On
RewriteCond $0#%{REQUEST_URI} ^([^#]*)#(.*)\1$
RewriteRule ^.*$ - [E=BASE:%2]
RewriteRule ^(.*?/)?images/(.*)$ %{ENV:BASE}$1img/$2 [R=302,NC,L,NE]
动态RewriteBase
的工作原理:
REQUEST_URI
变量(完整路径)与RewriteRule
匹配的URI(相对于当前路径)进行比较,并在%{ENV:BASE}
变量中得到差异。$0
中使用从RewriteRule
抓取的RewriteCond
,因为mod_rewrite
实际向后处理规则集。它从RewriteRule
中的模式开始,如果匹配,则继续检查一个或多个RewriteCond
。RewriteCond
中看到的那样,LHS(测试字符串)可以使用反向引用变量,例如$1
,$2
或%1
,%2
等,但RHS方面即条件字符串无法使用这些$1
,{{1} }或$2
,%1
变量。%2
,\1
等表示。\2
首次捕获的群组中RewriteCond
。它将由内部反向引用`\ 1。([^#]*)
和RewriteBase
来标记此规则基本上是动态查找%{REQUEST_URI}
。 $0
的示例将为%{REQUEST_URI}
,同一示例URI的/directory/foobar.php
示例将为$0
。 foobar.php
正在为第二个被捕获的群组^([^#]*)#(.*)\1$
或%2
带来差异。这里t将使用值\2
填充%2
或\2
,稍后在设置env变量/directory/
时使用该值%{ENV:BASE}
。