我有一个 VPS,我已将其配置为使用基于名称的托管来托管多个网站。一切都很好,只需使用示例.com, 和www.example.com. 它还适用于例子.net,但当我尝试例子.net,它又回到了我的默认站点配置,仅显示我的默认(空)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>
以下是示例.com地点:
<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>
这是配置例子.net地点:
<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 属性出了问题。
可能是因为网站建设方式?因为示例.com是Joomla网站,以及例子.net是一个 Zend Framework 网站。为了以防万一,我还会插入 .htaccess 文件例子.net, 自从示例.com是否已被禁用: 例子.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]
任何帮助将不胜感激!
编辑我的问题是绝对地清楚:问题在于,一个网站可以同时处理万维网前缀和没有前缀一样,而第二个没有。我想知道如何使第二个网站能够使用万维网前缀也是如此。
答案1
确保配置指令中的优先顺序与 Apache 处理请求的方式相匹配 - 例如,如果您的指令像这样加载,您将不会有太大的运气:
- 示例.com
- 默认/全部捕获
- 环球.lv
无论它们是在单个文件还是多个文件中声明 - 只要“universal.lv”是最后一个,它就不会被到达,因为默认/catch-all vhost 会在它之前。
出于这个原因,我通常将我的默认/catch-all 配置命名为“z-default.conf”(或者,如果您有一个以“z”、“zz”等开头的域),以确保仅在没有其他 vhost 匹配时才处理它。
尝试相应地重命名。
更新:为了避免与_default_
VirtualHost 指令混淆
使用通配符 DNS为了将所有对 example.com 的请求定向到服务器的 IP(捕获输入错误的子域),Apache 会解析以下配置文件:
- 000-default.conf -
VirtualHost _default_:80
/ServerName <hostname>
- 捕获针对服务器 IP 的请求(可以重定向到主域或简单地Directory
使用中指定的默认值进行阻止conf.d/security
) - 示例.conf-
VirtualHost *:80
/ServerName www.example.com
- example2.conf-
VirtualHost *:80
/ServerName www.example2.com
- zzz-example.conf -
VirtualHost *:80
/ServerName example.com
/ServerAlias *.example.com
- 重定向到规范的 www 域名 - zzz-example2.conf -
VirtualHost *:80
/ServerName example2.com
/ServerAlias *.example2.com
- 重定向到规范的 www 域名
据记载,Apache 选择第一个匹配的 VirtualHost(即_default_:80
),但如果您在指令中使用通配符,则此行为并不可取ServerAlias
。
答案2
我建议你阅读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>
注意名称虚拟主机部分。您的错误日志 (/var/log/apache2/error.log) 应该已经警告您可能犯了一个错误。
注意:更改配置文件后,需要重新启动Apache。
答案3
您需要在 httpd.conf 中启用 NameVirtualHost - 然后您可以在同一个 ip:port 上定义多个虚拟主机。