4

我有几个域,我想通过 mod_vhost_alias 启用通配符子域

包含在我的 httpd.conf 中,我有以下通用规则:

<VirtualHost [ip here]:80>
    ServerName domain1.com
    ServerAlias www.domain1.com
    DocumentRoot /home/user1/public_html
</VirtualHost>
<VirtualHost [ip here]:80>
    ServerName *.domain1.com
    VirtualDocumentRoot /home/user1/subdomains/%-3+
</VirtualHost> 

<VirtualHost [ip here]:80>
    ServerName domain2.com
    ServerAlias www.domain2.com
    DocumentRoot /home/user2/public_html
</VirtualHost>
<VirtualHost [ip here]:80>
    ServerName *.domain2.com
    VirtualDocumentRoot /home/user2/subdomains/%-3+
</VirtualHost>

问题是 apache 完全忽略了带有通配符 ServerNames 的虚拟主机。对 test.domain1.com 或 test.domain2.com 的任何请求都只会显示 /home/user1/public_html 的内容(根据 apache 的默认规则)。

其他一些信息:

/home/user1/subdomains/test并且/home/user2/subdomains/test都存在并在其中有文件

我所有的域都有一个在绑定配置中列出的通配符子域,它们指向 Vhost 规则中指定的相同 IP。子域的标准 Vhost 规则有效,但通配符无效。

的输出的剪辑版本httpd -S

# httpd -S
虚拟主机配置:
[ip here]:80 是 NameVirtualHost
         默认服务器 domain1.com (/etc/httpd/sites/user1:1)
         端口 80 namevhost domain1.com (/etc/httpd/sites/user1:1)
         端口 80 namevhost *.domain1.com (/etc/httpd/sites/user1:14)
         端口 80 namevhost domain2.com (/etc/httpd/sites/user2:1)
         端口 80 namevhost *.domain2.com (/etc/httpd/sites/user2:14)
语法OK
# httpd -M
加载模块:
 核心模块(静态)
 mpm_prefork_module(静态)
 http_module(静态)
 so_module(静态)
 rewrite_module(共享)
 auth_basic_module(共享)
 authz_host_module(共享)
 包含模块(共享)
 log_config_module(共享)
 logio_module(共享)
 mime_magic_module(共享)
 mime_module(共享)
 vhost_alias_module(共享)
 dir_module(共享)
 suexec_module(共享)
 php5_module(共享)
 suphp_module(共享)
 ssl_module(共享)
语法OK

任何有关问题所在的建议将不胜感激。

4

2 回答 2

11

我是个菜鸟,这是一个非常简单的解决方案。

ServerName不允许通配符,但允许ServerAlias,所以我只是再次复制了服务器名。

这是任何碰巧找到此答案的域的最终最小化配置(当您在谷歌上搜索并找到问题但没有答案时,我讨厌它):

<VirtualHost [ip here]:80>
    ServerName domain1.com
    ServerAlias www.domain1.com
    DocumentRoot /home/user1/public_html
</VirtualHost>
<VirtualHost [ip here]:80>
    ServerName domain1.com #<-- The fix. Wildcards not supported in ServerName
    ServerAlias *.domain1.com
    VirtualDocumentRoot /home/user1/subdomains/%-3+
</VirtualHost>
于 2009-04-24T14:26:55.487 回答
0

大卫,这个在成功时停止 mod_rewrite 循环的解决方案将对您的问题有用)。

重写循环停止器:

重写条件 %{ENV:REDIRECT_STATUS} 200|[45]0[0-9]
重写规则 .* - [L]
于 2010-02-07T00:20:23.117 回答