我有一个VPS,我已经configuration托pipe多个网站与基于名称的托pipe。 这只是使用example.com和www.example.com 。 它也适用于example.net ,但是当我尝试example.net时 ,它恢复到我的默认站点configuration,这只是显示我的默认(空)index.html页面。
这是默认文件:
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory /var/www/> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory> ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory> ErrorLog /var/log/apache2/error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog /var/log/apache2/access.log combined Alias /doc/ "/usr/share/doc/" <Directory "/usr/share/doc/"> Options Indexes MultiViews FollowSymLinks AllowOverride None Order deny,allow Deny from all Allow from 127.0.0.0/255.0.0.0 ::1/128 </Directory> </VirtualHost>
以下是example.com网站的configuration:
<VirtualHost *:80> ServerAdmin [email protected] ServerName example.com ServerAlias www.example.com DocumentRoot /srv/www/example.com/public_html/ ErrorLog /srv/www/example.com/logs/error.log CustomLog /srv/www/example.com/logs/access.log combined <Directory /srv/www/example.com/public_html/> AllowOverride All Order allow,deny allow from all </Directory> </VirtualHost>
这里是example.net网站的configuration:
<VirtualHost *:80> ServerAdmin [email protected] ServerName example.net ServerAlias www.example.net DocumentRoot /srv/www/example.net/public_html/ ErrorLog /srv/www/example.net/logs/error.log CustomLog /srv/www/example.net/logs/access.log combined <Directory /srv/www/example.net/public_html/> AllowOverride All Order allow,deny allow from all </Directory> </VirtualHost>
问题在哪里?
我相信,ServerAlias属性有问题。
难道这是因为网站的build设方式吗? 因为example.com是一个Joomla网站, example.net是一个Zend Framework网站。 为了以防万一,我还将为example.net插入.htaccess文件,因为example.com已禁用它: example.net :
SetEnv APPLICATION_ENV development RewriteRule ^(browse|config).* - [L] ErrorDocument 500 /error-docs/500.shtml SetEnv CACHE_OFFSET 2678400 <FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$"> Header set Expires "Fri, 25 Sep 2037 19:30:32 GMT" Header unset ETag FileETag None </FilesMatch> RewriteEngine On RewriteRule ^(adm|statistics) - [L] RewriteRule ^/public/(.*)$ http://example.net/$1 [R] RewriteRule ^(.*)$ public/$1 [L]
任何帮助将不胜感激!
编辑所以我的问题是绝对清楚的:问题是,一个网站的工作都与www前缀以及没有它,第二个不。 我想知道如何使第二个网站与www前缀一起工作。
确保configuration指令中的优先级顺序与Apache应该如何处理请求相匹配 – 也就是说,如果你的指令是这样加载的,你将不会有太多的运气:
无论它们是在单个文件还是多个文件中声明 – 只要“universal.lv”是最后一个,它将不会被达到,因为默认/全部捕获所有虚拟主机将在其之前。
我通常将这个默认的/ catch-allconfiguration命名为“z-default.conf”(或者,如果你有一个以“z”,“zz”等等开头的域),为了确保它是只有在没有其他虚拟主机匹配的情况
尝试相应地重命名。
更新:所以不要混淆_default_ VirtualHost指令
使用通配符DNS将所有请求指向example.com到服务器的IP(捕获错误键入的子域),Apacheparsing下列configuration文件:
VirtualHost _default_:80 / ServerName <hostname> – 捕获服务器IP的请求(可以redirect到主域,或者简单地用conf.d/security指定的默认Directory阻塞) VirtualHost *:80 / ServerName www.example.com VirtualHost *:80 / ServerName www.example2.com VirtualHost *:80 / ServerName example.com / ServerAlias *.example.com – redirect到规范的www域 VirtualHost *:80 / ServerName example2.com / ServerAlias *.example2.com – redirect到规范的www域 如文档所述, Apacheselect第一个匹配的VirtualHost(即_default_:80 ),但如果您在ServerAlias指令中使用通配符,则此行为不可取。
您需要将NameVirtualHost启用到httpd.conf – 然后您可以在同一个ip:port上定义多个虚拟主机。
我build议你先阅读虚拟主机上的Apache文档 。
http://httpd.apache.org/docs/2.2/vhosts/name-based.html提供了一个很好的例子:
NameVirtualHost *:80 <VirtualHost *:80> ServerName www.domain.tld ServerAlias domain.tld *.domain.tld DocumentRoot /www/domain </VirtualHost> <VirtualHost *:80> ServerName www.otherdomain.tld DocumentRoot /www/otherdomain </VirtualHost>
注意NameVirtualHost部分。 你的错误日志(/var/log/apache2/error.log)应该警告你,你犯了一个可能的错误。
注意:更改configuration文件后,需要重新启动Apache。