ServerAlias 不起作用

ServerAlias 不起作用

我有一个 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 属性出了问题。

可能是因为网站建设方式?因为示例.comJoomla网站,以及例子.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 上定义多个虚拟主机。

相关内容