我有以下的虚拟主机configuration:
<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/目录中提供的
也许是因为你有ServerAlias规则的domain.com
*.domain.com
这将匹配ebooks.domain.com和服务
/home/domain.com/public_html
我最好的build议是使用mod_rewrite与RewriteCond %{HTTP_HOST}但不幸的是我不知道给你更多的细节。 看看mod_rewrite手册/指南。
我以为这里的命令是关键,apache将服务于第一个匹配的服务器名,但我做了一个快速testing,似乎并不是这样。 它似乎总是匹配通配符,不pipe它们的顺序如何。
我能想到的最好的一个IP地址几乎是Evgenybuild议的,有一个虚拟主机,并为books.domain使用代理redirect。
<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地址,并且分配两个虚拟主机来分开地址,唯一的办法就是保留通配符和分离的虚拟主机。 我仍然觉得有一个更好的方法来做到这一点,但会感兴趣的其他解决scheme。
我认为Evgeny钉了它。
相关知识:NameVirtualHost指令的值必须与内容完全匹配,并且都不应该是主机名。 例如,NameVirtualHost *:80必须与。 “NameVirtualHost *:80”只能在configuration中出现一次。
正如Evgeny指出的books.domain.com是从public_html服务,因为这正是VirtualHosts说…你的第一个VirtualHost ServerAlias是ebooks.domain.com服务于/ home / media / books。 确保*。domain.com总是在最后一个VirtualHost [你有],只要一些前面的VirtualHost有一个ServerAlias匹配你input的域,VirtualHost将服务的响应。
如果你正在寻找一个更完全的通配符解决scheme,你可以重新安排像/ home / media / books,home / media / ebooks等目录结构,然后尝试这样的事情,并在一个虚拟主机中摆脱一切:
DocumentRoot /home/media #make sure you have a default index page RewriteEngine on RewriteCond %{SERVER_NAME} ^(.*).domain.com [NC] # make sure this is a subdomain call RewriteCond /%1/ -d # is there a directory for this subdomain RewriteRule ^/(.*)$ /%1/ # request filename now /home/media/%1 - client URL unchanged.
你有一个“NameVirtualHost *:80”或类似的全球configuration线?
当虚拟主机不能在Apache中工作时,通常会出现这种情况。