Я бы хотел, чтобы apache соответствовал каждому запросу для example.com и перенаправлял его на www.example.com. Любые другие хосты, отправленные браузером, которые не находятся в этом домене, должны возвращать 404.
Вот два моих хоста:
example.com:
<VirtualHost *>
ServerAdmin webmaster@example.com
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 по умолчанию.
<VirtualHost *>
ServerName example.com
Redirect permanent / http://www.example.com/
</VirtualHost>
Сделаем исправление вашего www / non-www материала.
Затем для любых других хостов просто укажите свой виртуальный хост по умолчанию на какой-то пустой корневой каталог документов (или какой-нибудь скрипт, который обрабатывает любой пользовательский 404, который вы хотите.
с помощью
ServerName example.com
ServerAlias *.example.com
Я получаю перенаправление с не www на www, но только example.com возвращает 404
Вам нужно добавить 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}.