基于子域的Apache动态别名

Modified on: Wed, 18 Sep 2019 21:20:02 +0800

我有以下结构作为ZF1应用程序的一部分 -

C:/www/multisite C:/www/multisite/application C:/www/multisite/public C:/www/multisite/client1/uploads C:/www/multisite/client2/uploads

我目前为每个子域都有以下vhost -

C:/www/multisite
C:/www/multisite/application
C:/www/multisite/public
C:/www/multisite/client1/uploads
C:/www/multisite/client2/uploads

我想基于子域动态实现这一点,但我无法弄清楚如何做到这一点。

{sub_domain}.multisite.dev

会导致

的别名

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

这可能吗?

作者:nnichols

最佳答案

[编辑]我已经测试了解决方案。它现在就像下面详述的梦一样。我在我的正则表达式中做了一个愚蠢的错误,现在已经纠正了。

这个想法是使用RewriteCond来捕获请求中的fqdn并将其拆分。正则表达式捕获域名的最左边部分,然后使用%1在RewriteRule中反向引用。我还从转换中转义了'public'目录,这使得它可以使用映射到站点的所有fqdn:s共有的URI路径访问(参见具体示例的测试结果)。

  • 我已为此实验禁用了虚拟主机文件。
  • 我的dns将 client1.multisite.dev client2.multisite.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!

我还在网络浏览器中输入网址时测试了混合情况。一切都被翻译成小写。

我注意到您在Windows上运行Apache,其本机文件系统不区分大小写。因此,归一化情况不是必需的,尽管我个人发现小写的URL:在我的浏览器中看起来更美观。在文件系统上,区分大小写的规范化将是一个要求,所以我将其包括在内以便完成。

最后,我还注意到在80以外的端口上运行Apache(即必须在url中拼写出来)会破坏RewriteRule反向引用。然而,我没有为此寻求解决方案。

我希望这等于或足够接近你需要的东西。

作者:,ErikE

相关问答

添加新评论