Вопрос: Перенаправить 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.


56
2018-03-08 20:56


Источник


stackoverflow.com/questions/42500012/... - rajeev


Ответы:


Оказывается 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>

101
2018-03-08 21:34



Для этого вам не нужен mod_rewrite. Вместо этого используйте mod_alias и его директив RedirectPermanent. - joschi
@joschi: Каким было бы это преимущество? Это быстрее? - DisgruntledGoat
Вам не нужен полнофункциональный механизм перезаписи со всеми его проверками и возможностями для просто перенаправления клиента. Это было бы (незначительно) быстрее, так как mod_alias не так сложна, как mod_rewrite, и вам понадобится только одна директива (RedirectPermanent) вместо двух с mod_rewrite. И последнее, но не в последнюю очередь ИМХО, легче понять, что происходит в конфигурации, когда кто-то смотрит на нее в первый раз. - joschi
По какой-то странной причине Redirect 301 .. не сработал для нас. Мы должны были использовать параметр RewriteRule. - so_mv
ПРИМЕЧАНИЕ. Использование PHP 5.3.0 на WAMPSERVER 2.0 на Windows Server 2008 R2 Enterprise, не включая :80 после VirtualHost * причины все вернуть «Запретный»! - Cees Timmerman


Будьте очень осторожны с 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, если он плохо настроен, может повредить вашу сеть.


3
2018-01-18 11:29



Пункт 301 состоит в том, что это постоянный перенаправления; если вы хотите перенаправлять непостоянную, вместо этого вы должны использовать 302 или 307. - nickgrim


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

редактировать

Поскольку вы хотите перенаправить и вам не нужны расширенные функции, кажется, что вы используете Redirect должно быть достаточно для вас. Вы бы поставили Redirect в соответствии с директивой VirtualHost.

Решение на стороне клиента было бы использовать meta refresh тег.


2
2018-03-08 21:00



Не могли бы вы объяснить немного дальше? Как мне перенаправить www.example.com в example.com используя этот метод? - DisgruntledGoat
В вашем главном vhost у вас есть записи для обоих ServerName а также ServerAlias, У одного есть example.com и другой сайт www.example.com. Затем обе записи DNS будут обращаться к документам, указанным в том же vhost. - Warner
Я хочу сделать переадресовывать хотя и не просто псевдоним. - DisgruntledGoat
Тогда рекомендация Джошчи может быть хорошим подходом для вас. Кажется, что в этот момент волосы расщепляются. - Warner


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


1
2018-03-08 21:18