Apache2 vhost 配置问题

Apache2 vhost 配置问题

我希望 apache 匹配对 example.com 的每个请求并重定向到 www.example.com。浏览器发送的不在此域上的任何其他主机都应返回 404。

这是我的两个虚拟主机:

示例.com:

<VirtualHost *>
    ServerAdmin [email protected]
    ServerName www.example.com
    ServerAlias *.example.com

    DocumentRoot /var/www/example.com/

    <Directory />
            Options FollowSymLinks
            AllowOverride All
    </Directory>

    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^.*example\.com$ [NC]
    RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]
    RewriteRule ^(.*)$ http://www.example.com$1 [R=301,L]

    ErrorLog /var/log/apache2/error.log
    LogLevel warn
    CustomLog /var/log/apache2/access.log combined
</VirtualHost>

000-默认:

<VirtualHost *>
    Redirect 404 /
</VirtualHost>

实际情况是,“www.example.com” 正在按应有的方式提供服务,“test” 的主机头也按应有的方式被 404 错误提示,而“example.com”却被 404 错误提示,这是不应该的。

这就像 apache 将“www”与 ServerName 指令匹配,但 ServerAlias 被忽略,并且“sub”的子域与默认 vhost 匹配。

答案1

<VirtualHost *>
   ServerName example.com
   Redirect permanent / http://www.example.com/
</VirtualHost>

将处理修复您的 www/非 www 内容。

然后对于任何其他主机,只需将您的默认 vhost 指向一些空的 documentroot(或一些处理您想要的自定义 404 的脚本)。

答案2

您需要将 example.com 添加到您的 ServerAlias 行:

ServerAlias example.com *.example.com

然后将 RewriteCond 重写为:

RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com$1 [R=301,L]

...因为我不认为您需要第一个 %{HTTP_HOST} 行。

答案3

使用

ServerName example.com
ServerAlias *.example.com

我获得了从非 www 到 www 的重定向,但 example.com 单独返回了 404

相关内容