2012-07-02 50 views
0

我一直试图弄清楚这一点。我很抱歉,如果这是一个重复的问题,但我似乎无法找到合适的解决方案。Apache Mod_rewrite改变目录

我试图做到的是以下几点:

给出的URL 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},如你会期待的。

+0

这些规则似乎是在正确的方向 - 他们不工作? – Ansari

+0

您不希望'%{DOCUMENT_ROOT}/path1%{REQUEST_URI}'为'%{DOCUMENT_ROOT}/override%{REQUEST_URI}'? –

+0

@Jon编辑翻译错误。 – sgcharlie

回答

0

你为什么不使你的文档根目录的/ 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] 

或者,你可以用/var/www取代%{DOCUMENT_ROOT}比如,尽管它是一种丑陋的,特别是如果你在其他地方移动网站或变更您的服务器配置。因此,你会得到这样的东西:

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] 
+0

在'/ var/www/devEx_ '中还有另一个.htaccess文件需要运行来做一些额外的重写。有没有什么方法可以调用.htaccess文件,而不会弄乱'%{REQUEST_URI}'变量? – sgcharlie

+0

@sgcharlie首先,在将文档根目录更改为'/ var/www /'no时,重写将总是修改'%{REQUEST_URI}',第二个是'/ var/www /'是硬编码的,%' {REQUEST_URI}'没有改变。 –

+0

对,您的示例不会更改'%{REQUEST_URI}'变量。我只是想知道,除了这两个规则列表之外,是否还有一种方法可以调用'/ var/www/devEx_ /.htaccess',而不会将'devEx_ '追加到'%{REQUEST_URI} ',如果这是有道理的。 – sgcharlie