我想在VirtualDocumentRoot
中使用RewriteRule
设置的值。
Apache documentation说:
要确定的另一件事是文档根(使用DocumentRoot配置并通过DOCUMENT_ROOT环境变量可用于CGI脚本)。在正常配置中,核心模块在将URI映射到文件名时使用它,但是当服务器配置为执行动态虚拟主机时,该作业必须由另一个模块(mod_vhost_alias或mod_rewrite)接管,该模块具有不同的做映射的方式。这些模块都不负责设置DOCUMENT_ROOT环境变量,因此如果任何CGI或SSI文档使用它,它们将获得误导性值。
参考文档,我似乎无法在%{DOCUMENT_ROOT}
中使用RewriteRule
。但在寻找替代解决方案之后,我发现ticket(标题: DOCUMENT_ROOT环境变量与VirtualDocumentRoot错误地设置)说它已经“在2.4.1中修复”。
我正在使用最新的(稳定版)Apache:
$ httpd -v
Server version: Apache/2.4.9 (Unix)
Server built: Jun 18 2014 03:07:48
......但它似乎对我不起作用。测试时,%{DOCUMENT_ROOT}
具有httpd.conf中DocumentRoot设置的默认值。我希望%{DOCUMENT_ROOT}
(或我可以使用的任何其他变量)由VirtualDocumentRoot
动态设置。
以下是我想在httpd-vhosts.conf中使用的内容:
<VirtualHost *:8080>
ServerName dev
ServerAlias *.dev
VirtualDocumentRoot "/usr/local/var/www/.dev/%-2+"
RewriteRule ^/(.*\.php(/.*)?)$ "fcgi://127.0.0.1:9000%{DOCUMENT_ROOT}/$1" [P]
</VirtualHost>
有解决方案吗?
答案 0 :(得分:0)
在用@John Auld查看了许多方向后(感谢您的时间和帮助),我终于找到了解决方案。正如我在a previous comment所说的,它不是100%完美,但对我来说已经足够了。
为了清楚起见,这是我想在httpd-vhosts.conf中拥有的内容:
<VirtualHost *:8080>
ServerName dev
ServerAlias *.dev
VirtualDocumentRoot "/usr/local/var/www/.dev/%-2+"
RewriteRule ^/(.*\.php(/.*)?)$ "fcgi://127.0.0.1:9000%{DOCUMENT_ROOT}/$1" [P]
</VirtualHost>
以下是我提出的建议:
<VirtualHost *:8080>
ServerName dev
ServerAlias *.dev
VirtualDocumentRoot "/usr/local/var/www/.dev/%-2/%-3"
RewriteCond %{SERVER_NAME} (?:([^.]+)\.)?([^.]+)\.dev
RewriteRule ^/(.*\.php(/.*)?)$ "fcgi://127.0.0.1:9000/usr/local/var/www/.dev/%2/${:%1|www}/$1" [P]
</VirtualHost>
我使用RewriteCond
捕获%{SERVER_NAME}
的部分内容,并在RewriteRule
中重复使用。
有两个捕获组:子域(%1
)和域(%2
)。子域是可选的,因此我使用语法${map:value|default}
为空子域设置默认值。
VirtualDocumentRoot
)不可用时, %N.M
有自己的默认值。如documentation中所述:
如果N或M大于可用部件的数量,则插入单个下划线。
这就是为什么我不得不使用一些&#34;技巧&#34;使其适用于可选的子域:
ln -sfv /path/to/the/project/www /path/to/the/project/_
如果你想办法做到这一点&#34;只配置&#34;,留下评论,我会用你的贡献编辑我的答案。