Apache Mod_rewrite更改目录

时间:2012-07-02 17:10:23

标签: apache mod-rewrite

我一直在努力解决这个问题。如果这是一个重复的问题我很抱歉,但我似乎无法找到合适的解决方案。

我想要完成的是以下内容:

如果dev-<sub>.example.com/resources/path/to/resource的网址sub不同,请转到/var/www/devEx_<sub>/override/resources/path/to/resource,如果它产生文件,或者/var/www/devEx_<sub>/main/resources/path/to/resource否则(我可以处理404)。

我可以找出一个解决方案,我手动添加每个人sub,但我无法弄清楚如何使用通配符或反向引用。

我已经尝试弄乱VirtualDocumentRoot,但我永远无法让devEx_<sub>部分显示在DOCUMENT_ROOT中以检查资源。

我尝试使用类似于此[mod_rewrite regex (too many redirects)]的解决方案,但它始终与REQUEST_URI混淆。

我过去曾尝试使用过这样的东西:

RewriteCond $1 (^resources/.*)
RewriteCond %{DOCUMENT_ROOT}/override%{REQUEST_URI} -f
RewriteRule ^(.*)$ %{DOCUMENT_ROOT}/override%{REQUEST_URI} [QSA,L]

RewriteCond $1 (^resources/.*)
RewriteRule ^(.*)$ %{DOCUMENT_ROOT}/main%{REQUEST_URI} [QSA,L]

另外,我真的很想了解更多使用Apache / Mod_rewrite,如果你有一个很好的技术指南或教程的建议,可以帮助我使用这个或一些调试技术(因为我不知道如何调试这些重写规则),我非常感谢知识所以请分享!

修改

关于我的试验的更多细节。

在我的VirtualDocumentRoot解决方案中,我能够路由到正确的目录,但我无法将目录设置为文档根目录,以便执行覆盖规则。

对于此解决方案[mod_rewrite regex (too many redirects)],我将conf中的DocumentRoot设置为/var/www,并将以下行放在目录中的.htaccess文件中

RewriteCond %{HTTP_HOST} ^dev-([^.]+)\.example\.com$ [NC]
RewriteCond %{DOCUMENT_ROOT}/devEx_%1 -d
RewriteCond %{ENV:REDIRECT_STATUS}  =""
RewriteRule .* /devEx_%1/$0 [L]

然而,正如您所料,这会将devEx_<sub>附加到%{REQUEST_URI}

1 个答案:

答案 0 :(得分:0)

  

为什么不将文档设为root / var / www /

这可能是您要做的最好的事情,具体取决于您提供的不在devEx目录中的其他内容,因为这些内容需要重新路由。你想要的东西看起来像这样:

RewriteCond $1 (^resources/.*)
RewriteCond %{HTTP_HOST} ^dev-(.*)\.example.com$ [NC]
RewriteCond %{DOCUMENT_ROOT}/devEx_%1/override%{REQUEST_URI} -f
RewriteRule ^(.*)$ /devEx_%1/override%{REQUEST_URI} [QSA,L]

RewriteCond $1 (^resources/.*)
RewriteCond %{HTTP_HOST} ^dev-(.*)\.example.com$ [NC]
RewriteRule ^(.*)$ /devEx_%1/main%{REQUEST_URI} [QSA,L]

或者,您可以将%{DOCUMENT_ROOT}的实例替换为/var/www,尽管它有点难看,特别是如果您将网站移动到其他位置或更改服务器配置。因此你会得到这样的东西:

RewriteCond $1 (^resources/.*)
RewriteCond %{HTTP_HOST} ^dev-(.*)\.example.com$ [NC]
RewriteCond /var/www/devEx_%1/override%{REQUEST_URI} -f
RewriteRule ^(.*)$ /var/www/devEx_%1/override%{REQUEST_URI} [QSA,L]

RewriteCond $1 (^resources/.*)
RewriteCond %{HTTP_HOST} ^dev-(.*)\.example.com$
RewriteRule ^(.*)$ /var/www/devEx_%1/main%{REQUEST_URI} [QSA,L]