我有以下虚拟主机配置:
<VirtualHost *>
ServerName books.domain.com
ServerAlias ebooks.domain.com
DocumentRoot /home/media/books/
<Directory /home/media/books>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ErrorLog /home/domain.com/logs/error.log
CustomLog /home/domain.com/logs/access.log combine
ServerSignature Off
</VirtualHost>
<VirtualHost *>
ServerName domain.com
ServerAlias domain.info domain.net domain.org *.domain.com *.domain.info *.domain.net *.domain.org
DocumentRoot /home/domain.com/public_html/
<Directory /home/domain.com/public_html>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ErrorLog /home/domain.com/logs/error.log
CustomLog /home/domain.com/logs/access.log combine
ServerSignature Off
</VirtualHost>
domain.com 在两个虚拟主机指令中是相同的
问题是 books.domain.com 正在从/home/domain.com/public_html/
目录提供服务
答案1
可能是因为你有 domain.com 的 ServerAlias 规则
*.domain.com
这将匹配 ebooks.domain.com 并提供服务
/home/domain.com/public_html
我最好的建议是使用 mod_rewrite,RewriteCond %{HTTP_HOST}
但不幸的是,我了解的还不够多,无法给你更多细节。请查看 mod_rewrite 手册/指南。
答案2
我原本以为顺序是这里的关键,Apache 将提供第一个匹配的服务器名,但我做了一个快速测试,情况似乎并非如此。它似乎总是匹配通配符,无论它们的顺序如何。
我能想到的最好的办法就是使用一个 IP 地址,就像 Evgeny 建议的那样,有一个虚拟主机,并对 books.domain 使用代理重定向。
<VirtualHost *>
ServerName domain.com
ServerAlias domain.info domain.net domain.org *.domain.com *.domain.info *.domain.net *.domain.org
DocumentRoot /home/domain.com/public_html/
<Directory /home/domain.com/public_html>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ErrorLog /home/domain.com/logs/error.log
CustomLog /home/domain.com/logs/access.log combine
ServerSignature Off
<Directory /home/media/books>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
Alias /home/media/books /books
RewriteRule ^books\.domain\.com(.*)$ http://domain.com/books$1 [NC,P,L]
RewriteRule ^ebooks\.domain\.com(.*)$ http://domain.com/books$1 [NC,P,L]
</VirtualHost>
我能想到的唯一保留通配符和独立虚拟主机的方法是,如果你有两个 IP 地址,并将两个虚拟主机分配给不同的地址。不过,我仍然觉得一定有更好的方法可以做到这一点,我对其他解决方案很感兴趣。
答案3
我认为叶夫根尼做得很好。
需要了解:NameVirtualHost 指令的值必须与 的内容完全匹配,并且两者都不能是主机名。例如,NameVirtualHost *:80 必须与 一起使用。“NameVirtualHost *:80”在配置中只能出现一次。
答案4
您是否有“NameVirtualHost *:80”或类似的全局配置行?
当虚拟主机在 Apache 中无法工作时,通常就是因为这个原因造成的。