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

63

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

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

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

Теги:
redirect
http
https

4 ответа

93
Лучший ответ

Попробуйте добавить это в свою конфигурацию vhost:

RewriteEngine On
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
  • 0
    * Вам может понадобиться добавить mod_rewrite. Для хостов на основе Ubuntu или Debian будет работать следующее: sudo a2enmod rewrite которая остановит любые ошибки конфигурации configtest / apache2. (Что получит стоковая установка, если вы используете дополнения vhost, представленные выше)
  • 0
    это работает только для основного домена (например, http://mywebiste.com -> https://mywebiste.com ), что https://mywebiste.com если я также subdomaind ( http://blog.mywebiste.com -> https://blog.mywebiste.com )?
Показать ещё 3 комментария
78

Оба отлично работают. Но, согласно документации Apache, вы должны избегать использования 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/

  • 32
    Это не отвечает без указания части ServerName вопроса
  • 0
    Это работает для моей настройки. Также не забывайте завершающий слеш, иначе он не будет правильно перенаправляться с подпапками
Показать ещё 1 комментарий
33

Это полный способ также отказаться от перенаправленных перенаправлений;)

Эти правила предназначены для использования в файлах .htaccess, поскольку RewriteRule в записи *: 80 VirtualHost не нуждается в Условиях.

RewriteEngine on
RewriteCond %{HTTPS} off [OR] 
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R=301,L]

Eplanations

RewriteEngine on

== > включить движок вообще

RewriteCond %{HTTPS} off [OR]

== > соответствует не-https соединениям, или (не установив [OR], приведет к неявному И!)

RewriteCond %{HTTP:X-Forwarded-Proto} !https

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

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

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

  • 0
    Другая проблема, ваш RewriteRule , вероятно, никогда не будет совпадать; почти уверен, что вы хотите удалить косую черту: RewriteRule ^(.*) …
  • 0
    Уверен, что не буду. Вы пропустили / синтаксис цели, включая флаг 'L'. Другой способ сделать это как Джон Лин.
Показать ещё 2 комментария
0

Куда именно это добавить, пожалуйста.

<VirtualHost *:80>
    ServerName www.example.com
    Redirect / https://www.example.com/
</VirtualHost>

<VirtualHost *:443>
    ServerName www.example.com
    # ... SSL configuration goes here
</VirtualHost>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню