我希望 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