mod重写匹配子目录中的文件

时间:2011-11-29 16:24:15

标签: apache .htaccess mod-rewrite

编辑:搞定了,这是最终版

RewriteCond $1 ^(.*?)/(.*)$
RewriteCond apps/%1/content/%2 -F
RewriteRule (.*) apps/%1/content/%2 [QSA,last]

编辑:底部的原始问题

我接近工作,这是我的mod_rewrite

中的规则
RewriteCond $1 ^(.*?)/(.*)$
RewriteCond %{DOCUMENT_ROOT}/johnsmith/apps/%1/content/%2 -f
RewriteRule (.*) apps/%1/content/%2 [QSA,last]

这将正确路由

的请求
http://host/johnsmith/blog/css/style.css

/docroot/johnsmith/apps/blog/content/css/style.css

但是,我需要将johnsmith硬编码到johnsmith下的.htaccess文件中。是否可以使用相对路径,如果没有,是否有可用的变量,所以我知道.htaccess的当前目录?

以下原始问题

假设我有一个带有/ docroot docroot的Apache Web应用程序 我在这里有一个css文件:

/docroot/johnsmith/apps/blog/content/css/style.css

我想通过

请求检索此文件
http://host/johnsmith/blog/css/style.css

.htaccess文件必须位于johnsmith文件夹中。以下规则集会导致无限重定向循环

RewriteCond ^(.*?)/(.*)$ apps/$1/content/$2 -f
RewriteRule ^(.*?)/(.*)$ apps/$1/content/$2 [QSA,last]

如果我略微更改它,摆脱这个条件,我可以转到一个页面,这是一个简单的PHP脚本来打印出查询字符串,显示

RewriteRule ^(.*?)/(.*)$ showquerystring.php?path=apps/$1/content/$2 [QSA,last]

路径等于apps / blog / content / css / style.css,这正是我所期望的。

谁能告诉我我错过了什么?

此外,johnsmith文件夹可以命名为任何东西,johnsmith中的.htaccess文件不应该硬编码johnsmith。

更简洁,我想问的是:

是否有可用于mod_rewrite的变量,它等于/blog/css/style.css

2 个答案:

答案 0 :(得分:0)

问题是/johnsmith/blog/css/style.css重定向到/johnsmith/apps/blog/content/css/style.css,重定向到/johnsmith/apps/apps/content/blog/content/css/style.css等等。这是因为apache将使用重写的网址重复重写过程。

此外,我不确定RewriteCond规则是否正确。

所以我认为这应该是:

RewriteRule ^apps/ - [L]
RewriteCond %{DOCUMENT_ROOT}/apps/$1/content/$2 -f
RewriteRule ^(.*?)/(.*)$ apps/$1/content/$2 [QSA,L]

答案 1 :(得分:0)

RewriteCond $1 ^(.*?)/(.*)$
RewriteCond apps/%1/content/%2 -F
RewriteRule (.*) apps/%1/content/%2 [QSA,last]