Назад | Перейти на главную страницу

URL-адрес перенаправления в Apache VirtualHost?

У меня есть выделенный сервер с 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