Apache Mod_重写以更改目录

Apache Mod_重写以更改目录,apache,mod-rewrite,Apache,Mod Rewrite,我一直在想办法解决这个问题。如果这是一个重复的问题,我很抱歉,但我似乎找不到合适的解决方案 我试图实现以下目标: 给定URL dev-.example.com/resources/path/to/resource,其中sub不同,如果它生成一个文件,请转到/var/www/devExè/override/resources/path/to/resource或/var/www/devExè/main/resources/path/to/resource,否则我可以处理404s 我可以找到一个解决方

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

我试图实现以下目标:

给定URL dev-.example.com/resources/path/to/resource,其中sub不同,如果它生成一个文件,请转到/var/www/devExè/override/resources/path/to/resource或/var/www/devExè/main/resources/path/to/resource,否则我可以处理404s

我可以找到一个解决方案,手动添加每个单独的子项,但无法找到如何使用通配符或反向引用

我尝试过使用VirtualDocumentRoot,但我无法让devEx部分显示在文档根中以检查资源

我尝试使用类似于此[]的解决方案,但它总是会弄乱请求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解决方案中,我能够路由到正确的目录,但我无法将该目录设置为文档根目录以执行覆盖规则

对于这个解决方案[],我将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_uu添加到%{REQUEST_URI}


为什么不将文档设为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]
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]
或者,您可以将%{DOCUMENT_ROOT}的实例替换为/var/www,尽管这有点难看,尤其是当您将站点移动到其他位置或更改服务器配置时。所以你会得到这样的结果:

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

这些规则似乎方向正确——它们不起作用吗?难道你不想%{DOCUMENT_ROOT}/path1%{REQUEST_URI}变成%{DOCUMENT_ROOT}/override%{REQUEST_URI}?@Jon编辑掉了翻译中的错误。@Ansari如果%{DOCUMENT_ROOT}是/var/www/devEx_u}和%{REQUEST_URI,这些规则就起作用了是/resources/path/to/resource,但我无法使用VirtualDocumentRoot或Mod_rewrite以允许我使用反向引用的方式配置它。为什么不将文档设为root/var/www/?在/var/www/devEx_u中还有另一个.htaccess文件需要运行以进行其他重写。有没有办法在不影响%{REQUEST_URI}变量的情况下调用该.htaccess文件?@sgcharlie在第一种情况下,当将文档根更改为/var/www/no时,重写将始终修改%{REQUEST_URI},在第二种情况下,其中/var/www/是硬编码的,%%{REQUEST_URI}没有更改。对,您的示例不会更改%{REQUEST_URI变量我只是想知道除了这两个规则列表中的一个之外,是否还有一种方法可以调用/var/www/devEx\uu/.htaccess,而无需将devEx\uu添加到%{REQUEST\u URI}的开头,如果这样做有意义的话。