У меня есть выделенный сервер с Apache, на котором я установил несколько VirtualHosts. Я установил один для обработки домена www, а также домена без www.
Мой файл VH .conf для www:
<VirtualHost *>
DocumentRoot /var/www/site
ServerName www.example.com
<Directory "/var/www/site">
allow from all
</Directory>
</VirtualHost>
С этим .htaccess
:
RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^www.example.com [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]
Есть ли простой способ перенаправить www на версию без www? Сейчас отправляю обе версии в один и тот же DocumentRoot
и используя .htaccess
но я уверен, что смогу сделать это в файле VirtualHost.
Оказывается mod_rewrite
правил в файле VirtualHosts, кроме RewriteBase
правило. Я закончил с этим:
<VirtualHost *>
ServerName www.example.com
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.example.com
RewriteRule ^/(.*)$ http://example.com/$1 [L,R=301]
</VirtualHost>
РЕДАКТИРОВАТЬ: по совету joschi в комментариях теперь я использую эту упрощенную версию, используя Redirect
директива от mod_alias
:
<VirtualHost *>
ServerName www.example.com
Redirect 301 / http://example.com/
</VirtualHost>
Будьте очень осторожны с перенаправлением 301, потому что по умолчанию браузер, который получает перенаправление 301, будет хранить его постоянно - это означает, что вы откажетесь от контроля того, что этот браузер увидит, когда он попытается получить доступ к домену. www.example.com
.
См., Например, это обсуждение http://getluky.net/2010/12/14/301-redirects-cannot-be-undon/
Так что либо убедитесь, что он не кэшируется, либо используйте mod_proxy (я рекомендую mod_proxy).
Если вы разрешаете пользователю видеть изменение URL-адреса в адресной строке браузера, используйте mod_rewrite:
<VirtualHost *>
ServerName www.example.com
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.example.com
RewriteRule ^/(.*)$ http://example.com/$1 [L,R=301,E=nocache:1]
## Set the response header if the "nocache" environment variable is set
## in the RewriteRule above.
Header always set Cache-Control "no-store, no-cache, must-revalidate" env=nocache
## Set Expires too ...
Header always set Expires "Thu, 01 Jan 1970 00:00:00 GMT" env=nocache
</VirtualHost>
Если вы хотите, чтобы "перенаправление" было невидимым для пользователя, используйте mod_proxy:
<VirtualHost *>
ServerName www.example.com
ProxyRequests Off
<Proxy *>
Order Deny,Allow
Deny from all
Allow from 203.0.113.67
</Proxy>
ProxyPass / http://example.com/
ProxyPassReverse / http://example.com/
</VirtualHost>
Следует отметить, что при неправильной настройке mod_proxy может нанести вред вашей сети.
Можете добавить ServerAlias example.com
к VirtualHost
но производительность будет отличаться от перенаправления.
редактировать
Поскольку вы хотите перенаправить и вам не нужны расширенные функции, похоже, что вы используете Redirect
вам должно хватить. Вы бы поставили Redirect
в соответствии с директивой VirtualHost.
Решение на стороне клиента заключалось бы в использовании meta refresh
тег.
ну, вы можете создать один виртуальный хост для SERVERNAME www.example.com и перенаправить его на другой виртуальный хост с servername example.com