【发布时间】:2016-09-08 09:21:41
【问题描述】:
我想用我的网络服务器为多个子域提供服务:
example.com
projects.example.com
blog.example.com
wiki.example.com
...
文档根目录设置如下:
ServerName example.com
ServerAlias *.example.com
VirtualDocumentRoot "/var/www/%0/public"
这很有效,因为它会自动将文档根目录设置为相应的子域。然而,我的下一个要求是,它应该检测文档根目录中的 public 文件夹是否存在,如果不存在,则从较早的一个目录中提供文件。
我的大多数应用程序都是用 Laravel 编写的,所以它们带有一个 public 文件夹,但有时我只想快速创建一个没有 public 的新脚本或部署没有 public 的外部软件。
因此,example.com(只提供静态index.html 和style.css)的文档根目录应该是/var/www/example.com/ 而不是/var/www/example.com/public。我通过重写规则尝试了这个:
<If "!-d '/var/www/' . %{HTTP_HOST} . '/public'">
RewriteEngine on
RewriteRule ^ "/var/www/%{HTTP_HOST}" [L,QSA]
</If>
这是重写错误日志的结果:
[rewrite:trace2] [pid 32153] mod_rewrite.c(475): [client 62.159.226.12:27139] 62.159.226.12 - - [example.com/sid#7f6588016340][rid#7f6587f810a0/initial] init rewrite engine with requested uri /
[rewrite:trace1] [pid 32153] mod_rewrite.c(475): [client 62.159.226.12:27139] 62.159.226.12 - - [example.com/sid#7f6588016340][rid#7f6587f810a0/initial] pass through /
[rewrite:trace3] [pid 32153] mod_rewrite.c(475): [client 62.159.226.12:27139] 62.159.226.12 - - [example.com/sid#7f6588016340][rid#7f6587f810a0/initial] [perdir *If/] add path info postfix: /var/www/example.com -> /var/www/example.com/public/
[rewrite:trace3] [pid 32153] mod_rewrite.c(475): [client 62.159.226.12:27139] 62.159.226.12 - - [example.com/sid#7f6588016340][rid#7f6587f810a0/initial] [perdir *If/] applying pattern '^' to uri '/var/www/example.com/public/'
[rewrite:trace2] [pid 32153] mod_rewrite.c(475): [client 62.159.226.12:27139] 62.159.226.12 - - [example.com/sid#7f6588016340][rid#7f6587f810a0/initial] [perdir *If/] rewrite '/var/www/example.com/public/' -> '/var/www/example.com'
[rewrite:trace1] [pid 32153] mod_rewrite.c(475): [client 62.159.226.12:27139] 62.159.226.12 - - [example.com/sid#7f6588016340][rid#7f6587f810a0/initial] [perdir *If/] initial URL equal rewritten URL: /var/www/example.com [IGNORING REWRITE]
如您所见,它正确映射了它,但由于某种原因没有从那里提供文件(我认为这是因为它没有附加 index.html 或类似的东西)。
我该如何解决这个问题?
【问题讨论】: