Нужно перенаправить весь трафик на https - PullRequest
30 голосов
/ 13 июля 2010

Я хочу перенаправить любой трафик, который идет на http://example.com на https://example.com

то же самое для http://example.com/about до https://example.com/about

Я думал, что это будет примерно так:

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

Ответы [ 6 ]

68 голосов
/ 13 июля 2010

Это работает для меня:

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

Если трафик поступает через HTTP без SSL, тогда перенаправьте на HTTP-эквивалент любой страницы, к которой первоначально пытался обратиться пользователь.Он также не включает никаких опций mod_rewrite, поэтому его легко читать.

Побочные слова: почему все чувствуют необходимость явно установить HTTP-код перенаправления и пометить один из своих перезаписей как «последний»" один?Серьезно, за последние несколько дней я видел десятки похожих правил htaccess.

12 голосов
/ 15 января 2017

Это предыдущий ответ с использованием .httaccess , но с добавлением изменений, предложенных в комментариях, а некоторые от меня:

RewriteEngine on
RewriteBase /
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://my.domain.name%{REQUEST_URI} [L,R=301]

Примечания:

  • Это для случаев, когда пользователь не имеет доступа к основной конфигурации, но имеет доступ к правилам .htaccess. Если у вас есть доступ к основной конфигурации, используйте решение mod_alias вместо .
  • Для меня правило не было подобрано без определения RewriteBase. Явное определение этого позволяет избавиться от неоднозначности с некоторыми настройками сервера.
  • По крайней мере, в некоторых конфигурациях %{HTTPS} не установлен на off при использовании http, но имеет значение null, поэтому !on является более надежным правилом, чем off.
  • Для явного имени хоста вы не полагаетесь на заголовок хоста на стороне клиента или конфигурацию сервера. Однако явное имя хоста обычно предполагает, что существует только один домен для перенаправления. Заголовок хоста создает некоторые значительные проблемы, такие как ограничение порта и предоставление данных клиенту. Другой вариант, предложенный Apache Wiki , заключается в использовании %{SERVER_NAME}. Если вы решите использовать это, посмотрите предостережение из этого обсуждения - оно основано на правильности другой конфигурации.
  • R=301 означает, что это постоянное перенаправление, как обычно в этом случае. Если вы вместо этого думаете, что это временно, это можно пропустить или указать как R=302.
  • L означает, что это последнее правило, которое будет применено к этому запросу. Оставьте это, если вы подозреваете или знаете, что после этого есть другие правила, которые вы не хотите применять. Вы можете удалить, если это единственное правило файла.
7 голосов
/ 13 января 2015

Согласно документации Apache , использование mod_alias более подходит, чем mod_rewrite для этой задачи.То есть, чтобы перенаправить весь HTTP-трафик на HTTPS, нужно:

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

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

Об этой конфигурации следует отметить две вещи:

  1. Вам необходим доступ к конфигурации основного серверафайл для этой конфигурации для работы.Директива VirtualHost действительна только в контексте «конфигурации сервера».
  2. Имейте в виду, что директивы mod_rewrite обрабатываются до директив mod_alias.Если у вас уже есть массивный блок RewriteRule с в вашем файле .htaccess, возможно, вам лучше использовать конфигурацию mod_rewrite.
2 голосов
/ 11 мая 2018

почему бы не просто и просто?

rewriteCond %{HTTPS} !on
rewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

это сработало для меня и кажется мне понятным.Приветствия.

1 голос
/ 24 декабря 2018

Работа в любых условиях:

<IfModule mod_rewrite.c>
RewriteEngine On

RewriteCond %{HTTP_HOST} ^www\.(.+) [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [NE,L,R=301]
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301] 

<IfModule>
0 голосов
/ 28 сентября 2018

После некоторых исследований это то, что сработало для меня, немного другая версия.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...