Перенаправление HTTP на HTTPS на виртуальном хосте по умолчанию без имени сервера


на моем сервере apache я хотел бы иметь возможность перенаправлять все входящие http-запросы на эквивалентный https-запрос. Загвоздка в том, что я хотел бы сделать это для моего виртуального хоста по умолчанию без указания ServerName и перенаправление работает с любым именем сервера, которое появилось в url-адресе запроса. Я надеюсь на что-то вроде этого:

NameVirtualHost *:80
<VirtualHost *:80>
    RedirectPermanent / https://%{SERVER_NAME}/
    ...
</VirtualHost>

возможно ли это с помощью Redirect или мне придется прибегнуть к Rewrite?

3 60

3 ответа:

попробуйте добавить это в свой vhost config:

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

==> матч переадресованные соединения (прокси-сервер, балансировщик нагрузки и т. д.)без https

RewriteRule ^/(.*) https://%{HTTP_HOST}/ [NC,R=301,L]

==> если одно из обоих условий совпадает, сделайте перезапись всего URL, отправив 301, чтобы этот "узнал" клиент (некоторые делают, некоторые нет) и L для последнего правила.