Как перенаправить все HTTP-запросы в HTTPS - PullRequest
273 голосов
/ 03 ноября 2010

Я пытаюсь перенаправить все незащищенные HTTP-запросы на моем сайте (например, http://www.example.com) на HTTPS (https://www.example.com). Я использую PHP, кстати. Могу ли я сделать это в .htaccess?

Ответы [ 24 ]

4 голосов
/ 28 сентября 2014

Добавьте следующий код в файл .htaccess:

Options +SymLinksIfOwnerMatch
RewriteEngine On
RewriteCond %{SERVER_PORT} !=443
RewriteRule ^ https://[your domain name]%{REQUEST_URI} [R,L]

Где [имя вашего домена] - это имя домена вашего сайта.

Вы также можете перенаправить определенные папки с вашего доменного имени, заменив последнюю строку кода выше на:

RewriteRule ^ https://[your domain name]/[directory name]%{REQUEST_URI} [R,L]
4 голосов
/ 22 августа 2015

Сделайте все, что описано выше для перенаправления.Просто добавьте «HTTP Strict Transport Security» в свой заголовок.Это позволит избежать атаки человека в середине.

Отредактируйте ваш файл конфигурации apache (например, /etc/apache2/sites-enabled/website.conf и /etc/apache2/httpd.conf) и добавьтеследующее на ваш VirtualHost:

# Optionally load the headers module:
LoadModule headers_module modules/mod_headers.so

<VirtualHost 67.89.123.45:443>
    Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
</VirtualHost>

https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security

2 голосов
/ 28 октября 2017

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

Во-первых, как уже упоминалось выше, вы должны настроить свои правила .htaccess mod_rewrite:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Затем в ваших файлах PHP (вам нужно делать это там, где это будет уместно для вашей ситуации, некоторые сайты будут направлять все запросы через один файл PHP, другие обслуживают различные страницы в зависимости отих потребности и выполняемый запрос):

<?php if ($_SERVER['HTTPS'] != 'on') { exit(1); } ?>

Приведенное выше необходимо выполнить ДО любого кода, который потенциально может предоставить защищенные данные в незащищенной среде.Таким образом, ваш сайт использует автоматическое перенаправление через HTACCESS и mod_rewrite, в то время как ваши сценарии гарантируют, что выходные данные не будут предоставлены, если к ним нет доступа через HTTPS.

Я полагаю, что большинство людей так не думают, и поэтому Apache рекомендуетВы не используете этот метод, где это возможно.Тем не менее, требуется только дополнительная проверка в конце разработки, чтобы гарантировать безопасность данных вашего пользователя.Надеемся, что это поможет кому-то еще, кому, возможно, придется изучить использование нерекомендованных методов из-за ограничений нашего хостинга.

2 голосов
/ 02 июля 2016

Чтобы перенаправить все http запросы на https, вы можете использовать:

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R]

Если mod-rewrite не включен и вы используете apache 2.4, вы также можете использовать Redirect директива * inside if для перенаправления http запросов на https.

Apache 2.4.

<if "%{HTTPS} !~ /on/">
Redirect / https://www.example.com/
</if>
1 голос
/ 07 февраля 2017

Если вам не нужен mod_rewrite для других целей, использование основной директивы Apache IF чище и быстрее:

<If "%{HTTPS} == 'off'">
Redirect permanent / https://yoursite.com/
</If>

Вы можете добавить дополнительные условия в директиву IF, например, обеспечить один канонический домен без префикса www:

<If "req('Host') != 'myonetruesite.com' || %{HTTPS} == 'off'">
Redirect permanent / https://myonetruesite.com/
</If>

В использовании mod_rewrite для всего есть много инерции знакомства, но посмотрите, работает ли это для вас.

Подробнее: https://httpd.apache.org/docs/2.4/mod/core.html#if

Чтобы увидеть его в действии (попробуйте без www. Или https://, или с .net вместо .com): https://nohodental.com/ (сайт, над которым я работаю).

1 голос
/ 17 декабря 2016

Через .htaccess Это поможет.

RewriteEngine On


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

RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]

Кроме того, обратитесь к этому для более подробной информации. Как перенаправить Http в Https?

0 голосов
/ 20 марта 2019
 Redirect 301 / https://example.com/

(сработало для меня, когда ни один из приведенных выше ответов не сработал)

Бонус:

ServerAlias www.example.com example.com

(исправлено https://www.example.com не найдено)

0 голосов
/ 01 ноября 2018

У меня работает:

<IfModule mod_rewrite.c>
 RewriteEngine On
  RewriteCond %{HTTPS} !on
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>

и, например, http://server/foo?email=someone%40example.com перенаправляет нормально без каких-либо проблем.Файл .htaccess находится в корневой папке сайта (например, с именем public_html).Можно использовать RewriteCond% {SERVER_PORT}! ^ 443 $ вместо RewriteCond% {HTTPS}! On

0 голосов
/ 07 июля 2018

Если вы используете Elastic Load Balancer от Amazon Web Services, который принимает трафик https и направляет его на ваш сервер (ы) с http, правильный способ перенаправления всего трафика http на https описан здесь: https://aws.amazon.com/premiumsupport/knowledge-center/redirect-http-https-elb

Используйте заголовок X-Forwarded-Proto (содержит http или https), который всегда включен в http-запросы от балансировщика нагрузки, как описано здесь: https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/x-forwarded-headers.html

В файле httpd.conf:

<VirtualHost *:80>

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

</VirtualHost>

Или в вашем корневом .htaccess файле:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

Бонус: он не будет пытаться перенаправить http-трафик на ваш локальный компьютер для разработки.

0 голосов
/ 03 июля 2018

Я нашел способ заставить все страницы моего сайта перенаправить с http на аналог страниц на https, который работает для меня.

RewriteEngine On 
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
...