Перенаправление HTTP на HTTPS на виртуальном хосте по умолчанию без имени сервера
на моем сервере apache я хотел бы иметь возможность перенаправлять все входящие http-запросы на эквивалентный https-запрос. Загвоздка в том, что я хотел бы сделать это для моего виртуального хоста по умолчанию без указания ServerName
и перенаправление работает с любым именем сервера, появившимся в url-адресе запроса. Я надеюсь на что-то вроде этого:
NameVirtualHost *:80
<VirtualHost *:80>
RedirectPermanent / https://%{SERVER_NAME}/
...
</VirtualHost>
возможно ли это с помощью Redirect
или мне придется прибегнуть к Rewrite
?
3 ответов
попробуйте добавить это в конфигурацию vhost:
RewriteEngine On
RewriteRule ^(.*)$ https://%{HTTP_HOST} [R=301,L]
оба работают нормально. Но согласно Apache docs вы должны избегать использования mod_rewrite
для простых перенаправлений и использования Redirect
. Поэтому, согласно им, вы должны предпочтительно сделать:
<VirtualHost *:80>
ServerName www.example.com
Redirect / https://www.example.com/
</VirtualHost>
<VirtualHost *:443>
ServerName www.example.com
# ... SSL configuration goes here
</VirtualHost>
первый /
после Redirect
является url, вторая часть, где она должна быть перенаправлена.
вы также можете использовать его для перенаправления URL-адреса поддомена:
Redirect /one/ http://one.example.com/
это полный способ опустить ненужные перенаправления тоже ;)
эти правила предназначены для использования в .файлы htaccess, а в RewriteRule в *:80 запись VirtualHost нужны никакие условия.
RewriteEngine on
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^/(.*) https://%{HTTP_HOST}/ [NC,R=301,L]
Eplanations:
RewriteEngine on
== > включить двигатель вообще
RewriteCond %{HTTPS} off [OR]
==> матч не-https соединения, или (не установка [или] вызовет неявное и !)
RewriteCond %{HTTP:X-Forwarded-Proto} !https
==> матч пересылаемые соединения (прокси, loadbalancer и т. д.) без https
RewriteRule ^/(.*) https://%{HTTP_HOST}/ [NC,R=301,L]
==> если одно из обоих условий совпадает, перепишите весь URL-адрес, отправив 301, чтобы этот "узнал" клиент (некоторые делают, некоторые нет) и L для последнего правила.