作为 ZF1 应用程序的一部分,我有以下结构 -
C:/www/multisite
C:/www/multisite/application
C:/www/multisite/public
C:/www/multisite/client1/uploads
C:/www/multisite/client2/uploads
我目前为每个子域配备了以下虚拟主机 -
<VirtualHost *:80>
DocumentRoot "C:/www/multisite/public"
ServerName client1.multisite.dev
Alias /uploads C:/www/multisite/client1/uploads
FallbackResource /index.php
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "C:/www/multisite/public"
ServerName client2.multisite.dev
Alias /uploads C:/www/multisite/client2/uploads
FallbackResource /index.php
</VirtualHost>
我想根据子域动态地实现这一点,但我不知道如何做到这一点。
{sub_domain}.multisite.dev
会导致别名
Alias /uploads C:/www/multisite/{sub_domain}/uploads
这可能吗?
答案1
[编辑] 我已经测试了该解决方案。它现在运行得非常好,如下所述。我在正则表达式中犯了一个愚蠢的错误,现在已更正。
这个想法是使用 RewriteCond 来捕获请求中的 fqdn 并将其拆分。正则表达式捕获域名的最左侧部分,然后使用 %1 在 RewriteRule 中反向引用该部分。我还转义了'民众'目录来自翻译,这使得它能够使用映射到站点的所有 fqdn:s 通用的 URI 路径进行访问(具体示例请参见测试结果)。
- 为了本次实验的目的,我已禁用虚拟主机文件。
- 我的 DNS 点客户端1.多站点.dev和客户端2.多站点.dev到我的 Apache 2.2 测试服务器。
- 以下代码片段在我的httpd.conf中。
。
RewriteEngine On
RewriteMap lowercase int:tolower
RewriteCond %{REQUEST_URI} !^/public/
RewriteCond ${lowercase:%{HTTP_HOST}} ^([^.]+)\.multisite\.dev$
RewriteRule ^/(.*) /myApache/runtime/docs/www/multisite/%1/$1
我已经创建了这个目录结构。
/myApache/runtime/docs/www/multisite/client1/uploads
/myApache/runtime/docs/www/multisite/client2/uploads
/myApache/runtime/docs/www/multisite/public
每个目录都有一个名为index.htm的单独文件。index.htm的内容显示了它所在的目录路径。
冲浪至http://client1.multisite.dev/public/index.htm或者http://client2.multisite.dev/public/index.htm给出结果:
Hi!
Served from /myApache/runtime/docs/www/multisite/public/index.htm
See you!
冲浪至http://client1.multisite.dev/uploads/index.htm给出结果:
Hi!
Served from /myApache/runtime/docs/www/multisite/client1/uploads/index.htm
See you!
冲浪至http://client2.multisite.dev/uploads/index.htm给出结果:
Hi!
Served from /myApache/runtime/docs/www/multisite/client2/uploads/index.htm
See you!
我还测试了在浏览器中输入 URL 时混合大小写的情况。所有内容都会被翻译成小写。
我注意到您在 Windows 上运行 Apache,而 Windows 的本地文件系统不区分大小写。因此,规范大小写不是必需的,尽管我个人认为小写的 URL:s 在浏览器中看起来更美观。但在区分大小写的文件系统上,规范大小写是必需的,因此我将其包括在内以完成。
最后,我还注意到,在 80 以外的端口上运行 Apache(即必须在 URL 中拼写出来)会破坏 RewriteRule 反向引用。不过,我并没有为此寻求解决方案。
我希望这等于或足够接近您的需要。
答案2
尝试 mod_vhost_alias:http://httpd.apache.org/docs/2.2/mod/mod_vhost_alias.html 例子:
<VirtualHost *:80>
ServerName apps.mydomain.ltd
ServerAlias *.apps.mydomain.ltd
VirtualDocumentRoot /web/mydomain.ltd/apps/%1/public_html
CustomLog /web/mydomain.ltd/access_apache.log vhost_log_format
ErrorLog /web/mydomain.ltd/logs/error_apache.log
ServerAdmin [email protected]
<Directory "/web/mydomain.ltd/apps">
Options FollowSymLinks
Order allow,deny
Allow from all
AllowOverride All
</Directory>
</VirtualHost>