基于子域名的Apache动态别名

基于子域名的Apache动态别名

作为 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>

相关内容