2010-07-13 2 views
19

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

же для http://example.com/about к

Я думал, что это будет что-то вроде этого:

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

Пожалуйста, используйте example.com для всех проблем с доменом, если вы не хотите использовать свой фактический домен. – animuson

+0

Возможный дубликат [Как перенаправить все HTTP-запросы на HTTPS] (http://stackoverflow.com/questions/4083221/how-to-redirect-all-http-requests-to-https) – Sadurnias

ответ

50

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

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

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

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

+2

Я думаю, что если переписать «корректирующее» действие, ответ 301, вероятно, более уместен, чем ответ по умолчанию 302, и требует явного объявления. Что касается 'L', то это необязательно, если у вас не будет никаких других совпадений правил, но если вы это сделаете, это может легко предотвратить перенаправление, удалив новую информацию о схеме/хосте. Учитывая, что большинство людей «забывают» опубликовать остальные свои правила в полтора раза, это более безопасный вариант. Если правил больше нет, я согласен, что это просто беспорядок, и я действительно не понимаю его, когда они используют его только в одном правиле в файле ... –

+1

Хотя это, похоже, работает, это неправильно: это потому что это зависит от заголовка «Host», который отправляется клиентом. Кроме того, заголовок хоста может также содержать порт: поэтому, если заголовок хоста в запросе клиента содержит порт: 80, у местоположения будет порт: 80 с https, что неверно. См. Http://serverfault.com/questions/814153/apache-returning-wrong-location-header. Ответ от t-richards http://stackoverflow.com/a/27930928/1504300 кажется лучше – reallynice

+0

@reallynice вы могли бы просто жестко кодировать заголовок хоста, верно? Для серверов, где есть только один. Часто у вас может не быть доступа к основному конфигурационному файлу сервера, но у вас есть права .htaccess, поэтому в тех случаях я бы просто использовал это, но hardcode для хоста. – eis

7

Согласно Apache documentation, использование 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 s в вашем файле .htaccess, вам может быть лучше с конфигурацией mod_rewrite.
+0

В моем случае «Перенаправление постоянным» должно было быть: «Перенаправить постоянный http://www.example.com https: // www.example.com» в противном случае в браузере Я получаю ошибку цикла –

8

Это previous answer using .httaccess но добавление изменений, предложенных в комментариях, и некоторые от меня:

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

Примечания:

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