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


61

У мене є виділений сервер з 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.


Відповіді:


105

Виявляється, 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>

EDIT: за порадою joschi в коментарях, я зараз використовую цю спрощену версію, використовуючи Redirectдирективу від mod_alias:

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

2
Для цього вам не потрібно mod_rewrite. Замість цього використовуйте mod_alias та його директиву RedirectPermanent.
joschi

@joschi: У чому б це було перевагою? Це швидше?
НевдоволенийGoat

12
Вам не потрібен повномасштабний механізм перезапису з усіма його перевірками та можливостями, щоб просто перенаправити клієнта. Це було б (незначно) швидше, оскільки mod_alias не є таким складним, як mod_rewrite, і вам знадобиться лише одна директива (RedirectPer стала) замість двох з mod_rewrite. І останнє, але не менш важливе, IMHO простіше зрозуміти, що відбувається в конфігурації, коли хтось дивиться на це вперше.
Джоші

1
З якоїсь дивної причини переадресація 301 .. не працювала для нас. Нам довелося скористатися параметром RewriteRule.
so_mv

Примітка: Використання PHP 5.3.0 на WampServer 2.0 на Windows Server 2008 R2 Enterprise, а НЕ в тому числі :80після того, як VirtualHost *причини все , щоб повернутися "Forbidden"!
Cees Timmerman

4

Будьте дуже обережні з переадресаціями 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 при неправильній конфігурації може завдати шкоди вашій мережі.


5
Суть 301 полягає в тому, що це постійне перенаправлення; якщо ви хочете непостійне переспрямування, вам слід скористатись 302 або 307.
nickgrim

2

Ви можете додати ServerAlias example.comдо VirtualHostале продуктивність буде відрізнятися від редиректу.

Редагувати

Оскільки ви хочете перенаправлятись і вам не потрібна розширена функціональність, вам здається, що використання вам Redirectповинно вистачити. Ви б ставили Redirectпід директиву VirtualHost.

Рішенням на стороні клієнта було б використання meta refreshтегу.


Чи можете ви пояснити трохи далі? Як би я переспрямовувався www.example.comна example.comвикористання цього методу?
НезадоволенеЗабез

У своєму первинному vhost ви маєте записи як для, так ServerNameі для ServerAlias. Один має example.com, а другий www.example.com. Тоді обидві записи dns отримають доступ до документів, зазначених у тому самому vhost.
Warner

Хочу зробити переадресацію, але не лише псевдонім.
НевдоволенийГот

Тоді рекомендація joshchi може бути для вас хорошим підходом. Начебто волоски розщеплюються в цей момент.
Уорнер

1

добре, ви можете створити один віртуальний хост для SERVERNAME www.example.com і перенаправити його на інший віртуальний хост із ім'ям сервера example.com

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.