我有以下虚拟主机配置:
<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/
目录提供的
也许是因为你有 domain.com 的 ServerAlias 规则
这将匹配 ebooks.domain.com 并从
/home/domain.com/public_html
我最好的建议是使用 mod_rewrite ,
RewriteCond %{HTTP_HOST}
但不幸的是我没有足够的知识来给你更多的细节。看看 mod_rewrite 手册/指南。我原以为顺序是这里的关键,apache 将提供第一个匹配的服务器名,但我做了一个快速测试,但似乎并非如此。它似乎总是匹配通配符,不管它们的顺序是什么。
我能想到的最好的一个 IP 地址几乎就是 Evgeny 所建议的,拥有一个虚拟主机并为 books.domain 使用代理重定向。
我能想到的保留通配符和单独的虚拟主机的唯一方法是,如果您有两个 IP 地址,并将这两个虚拟主机分配给单独的地址。我仍然觉得必须有更好的方法来做到这一点,但会对其他解决方案感兴趣。
我认为 Evgeny 做到了。
很高兴知道:NameVirtualHost 指令的值必须与内容完全匹配,并且都不应该是主机名。例如,NameVirtualHost *:80 必须与 . “NameVirtualHost *:80”在配置中只能出现一次。
正如 Evgeny 所指出的,books.domain.com 是从 public_html 提供的,因为这正是 VirtualHosts 所说的......您的第一个 VirtualHost ServerAlias 是从 /home/media/books 提供的 ebooks.domain.com。确保 *.domain.com 始终位于最后一个 VirtualHost [您拥有的] 中,只要某些前面的 VirtualHost 具有与您输入的域匹配的 ServerAlias,VirtualHost 将提供响应。
如果您正在寻找更完整的通配符解决方案,并且您可以重新排列目录结构,例如 /home/media/books、home/media/ebooks 等,那么尝试这样的操作并在单个 VirtualHost 中处理所有内容:
您是否有“NameVirtualHost *:80”或类似的全局配置行?
当虚拟主机在 Apache 中不起作用时,这通常是错误的。