【问题标题】:Dynamically configured virtual hosting动态配置的虚拟主机
【发布时间】:2011-06-05 20:07:59
【问题描述】:

喂! 我想为将来使用 mod_rewrite 创建的所有子域准备一个动态虚拟主机。所有子域的配置方式几乎相同,所以我想到了使用动态 VH 配置。 我希望每个子域的文档根目录为 /home/user/public_html/subdomainName。

我尝试了以下配置,但没有成功:

<VirtualHost xxx.xxx.xxx.xxx:80>
    # get the server name from the Host: header
    UseCanonicalName Off

    <Directory /home/user/public_html/>
    # ExecCGI is needed here because we can't force
    # CGI execution in the way that ScriptAlias does
      Options FollowSymLinks ExecCGI
    </Directory>

    RewriteEngine On

    # a ServerName derived from a Host: header may be any case at all
    RewriteMap lowercase int:tolower

    #rule that is suposed to set document root of virtual host!??? 
    RewriteRule ^([a-z-]+)\.domain\.com/?(.*) /home/user/public_html/$1/$2

</VirtualHost>

规则或某事似乎是错误的,它不适用。我以前从未使用过动态 VH,所以我不知道我错在哪里......

【问题讨论】:

  • 这个问题更适合serverfault.com

标签: apache mod-rewrite dynamic virtualhost


【解决方案1】:

这是很多人在您之前就有的需求。所以有一个 apache 模块可以为你做到这一点 mod_vhost_alias http://httpd.apache.org/docs/2.2/mod/mod_vhost_alias.html

提供动态配置 海量虚拟主机

【讨论】:

    【解决方案2】:

    使用 RewriteRule 您无法访问域名。对该部分也使用 RewriteCond 并使用 %1 等进行反向引用。

    RewriteCond %{HTTP_HOST} ^([a-z-]+)\.domain\.com$ [NC]
    RewriteRule (.*) %1/$1
    

    唯一的问题是这将创建一个附加子域名字符串的持续循环。所以我通常做的是为子域创建一个单独的文件夹,比如“子域”

    RewriteRule ^subdomains - [L]
    RewriteCond %{HTTP_HOST} ^([a-z-]+)\.domain\.com$ [NC]
    RewriteRule (.*) subdomains/%1/$1
    

    【讨论】:

    • Tnx!我之前尝试过这个,但陷入了我现在通过您的子域文件夹想法解决的循环中。现在我想知道是否也可以为每个子域更改 DocumentRoot 以便它直接指向文件夹 /subdomains/subdomainName ?这是否可以通过重写 VH 解决方案实现,还是我必须为每个子域创建单独的 VirtualHost?
    • documentRoot 每个 VH 都是固定的。因此,要么您解决 DocumentRoot 值的“不正确性”,要么您必须为每个子域创建一个 VH。你需要 DocumentRoot 做什么?
    • 每个子域都应该包含我的 CRM 应用程序的一个实例。但是当我在编程时,我认为它会在 root 上,所以我使用了 php 的 $_SERVER["DOCUMENT_ROOT"], ... 现在这些路径是不正确的,因为 app.被放置在 documentRoot 下的两个级别。有没有办法解决这个问题?
    • 您可以添加一个自动前置 php 文件,该文件根据 $_SERVER['HTTP_HOST'] 修改 $_SERVER["DOCUMENT_ROOT"] 变量。我不确定您是否可以直接从 apache/htaccess 更改 $_SERVER["DOCUMENT_ROOT"]
    • 我可能只是要更正相对路径,所以 documentRoot 无关紧要......反正 Tnx!
    【解决方案3】:

    您也可以使用通配符 dns 来代替动态虚拟主机,这意味着将 {anything}.yourdomain.tld 配置为指向您的服务器。

    这也将为您提供每个域的相同文档根目录。

    请注意,您需要将ServerAlias *.yourdomain.tld 添加到虚拟主机条目中

    【讨论】:

    • Tnx,但如果可能的话,我希望每个子域都有单独的 documentRoot。否则我在子域中的应用程序无法正常工作(路径错误)。
    猜你喜欢
    • 2017-05-27
    • 1970-01-01
    • 2011-08-01
    • 2011-05-04
    • 2014-09-01
    • 2014-10-29
    • 2017-06-14
    • 2012-08-22
    相关资源
    最近更新 更多