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

61

У меня есть выделенный сервер с Apache, на котором я настроил несколько виртуальных хостов. Я настроил один для обработки домена 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.

DisgruntledGoat
источник

Ответы:

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>

РЕДАКТИРОВАТЬ: по совету Joschi в комментариях, я сейчас использую эту упрощенную версию, используя Redirectдирективу из mod_alias:

<VirtualHost *>
  ServerName www.example.com
  Redirect 301 / http://example.com/
</VirtualHost>
DisgruntledGoat
источник
2
Вам не нужно mod_rewrite для этого. Вместо этого используйте mod_alias и его директиву RedirectPermanent.
Йоси
@joschi: Каково было бы преимущество этого? Это быстрее?
Рассерженная шлюха
12
Вам не нужен полноценный механизм переписывания со всеми его проверками и возможностями, чтобы просто перенаправить клиент. Это было бы (незначительно) быстрее, так как mod_alias не так сложен, как mod_rewrite, и вам понадобится только одна директива (RedirectPermanent) вместо двух с mod_rewrite. И последнее, но не менее важное ИМХО, легче понять, что происходит в конфигурации, когда кто-то смотрит на нее в первый раз.
Йоси
1
По какой-то странной причине Redirect 301 .. у нас не работал. Нам пришлось использовать опцию RewriteRule.
so_mv
ПРИМЕЧАНИЕ. Использование PHP 5.3.0 в WAMPSERVER 2.0 в Windows Server 2008 R2 Enterprise, не считая :80после, VirtualHost *приводит к тому, что все возвращает «Запрещено»!
Сис Тиммерман
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.
Никгрим
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
Я хочу сделать перенаправление , а не просто псевдоним.
Рассерженный Гоат
Тогда рекомендация Йоши может быть хорошим подходом для вас. Похоже, что волосы в этот момент расщепляются.
Warner
1

ну, вы можете создать один виртуальный хост для SERVERNAME www.example.com и перенаправить его на другой виртуальный хост с помощью servername example.com

Девин Сеартас
источник