0

我想使用 a 中设置的VirtualDocumentRootRewriteRule

Apache文档说:

要确定的另一件事是文档根目录(使用 DocumentRoot 配置并通过 DOCUMENT_ROOT 环境变量可用于 CGI 脚本)。在正常配置中,核心模块在将 URI 映射到文件名时使用它,但是当服务器配置为进行动态虚拟主机时,该作业必须由另一个模块(mod_vhost_alias 或 mod_rewrite)接管,该模块具有不同的映射的方式。这些模块都不负责设置 DOCUMENT_ROOT 环境变量,因此如果任何 CGI 或 SSI 文档使用它,它们将获得误导性值。

参考文档,看来我将无法%{DOCUMENT_ROOT}RewriteRule. 但在寻找替代解决方案后,我发现这张(标题: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>

有解决办法吗?

4

1 回答 1

0

在与@John Auld一起看了很多方向之后(感谢您的时间和帮助),我终于找到了解决方案。正如我在之前的评论中所说,它不是 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当部件 ( ) 不可用时,它有自己的默认值。如文档中所述:

如果 N 或 M 大于可用部分的数量,则插入一个下划线。

这就是为什么我不得不使用一些“技巧”来使其与可选的子域一起工作:

ln -sfv /path/to/the/project/www /path/to/the/project/_

如果您想出一种“仅配置”的方法,请发表评论,我将根据您的贡献编辑我的答案。

于 2014-06-23T12:34:46.697 回答