Перенаправление 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 для последнего правила.