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

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

Ответы [ 24 ]

319 голосов
/ 15 февраля 2014

В Apache docs рекомендуется не использовать перезапись:

Чтобы перенаправить http URL-адреса на https, выполните следующие действия:

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

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

Этот фрагмент должен идти в основной файл конфигурации сервера, , а не в .htaccess, как указано в вопросе.

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

279 голосов
/ 03 ноября 2010

Обновление: Хотя этот ответ был принят несколько лет назад, обратите внимание, что его подход теперь рекомендован против в документации Apache.Вместо этого используйте Redirect.См. этот ответ .


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

Источник

128 голосов
/ 30 декабря 2014

Я бы рекомендовал с 301 редиректом:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
35 голосов
/ 03 ноября 2010

Как я уже говорил в этом вопросе , я бы посоветовал вам избегать перенаправления всех HTTP-запросов к их HTTPS-эквиваленту вслепую, так как это может вызвать у вас ложное впечатление о безопасности. Вместо этого вам, вероятно, следует перенаправить «корень» вашего HTTP-сайта в корень вашего HTTPS-сайта и ссылаться оттуда только на HTTPS.

Проблема в том, что если какая-либо ссылка или форма на сайте HTTPS заставляет клиента отправлять запрос на сайт HTTP, его содержимое будет видно до перенаправления.

Например, если одна из ваших страниц, обслуживаемых по HTTPS, имеет форму с надписью <form action="http://example.com/doSomething"> и отправляет некоторые данные, которые не следует отправлять в незашифрованном виде, браузер сначала отправит полный запрос (включая сущность, если это POST) на сайт HTTP в первую очередь. Перенаправление будет немедленно отправлено в браузер, и, поскольку большое количество пользователей отключает или игнорирует предупреждения, оно, вероятно, будет проигнорировано.

Конечно, ошибка предоставления ссылок, которые должны быть на сайт HTTPS, но в конечном итоге на сайт HTTP, может вызвать проблемы, как только вы услышите что-то, прослушивающее порт HTTP на том же IP-адресе, что и ваш HTTPS. сайт. Тем не менее, я думаю, что сохранение двух сайтов в качестве «зеркала» только увеличивает вероятность ошибок, так как вы можете предположить, что он самокорректируется, перенаправляя пользователя на HTTPS, хотя это часто слишком поздно. (В этом вопросе были подобные обсуждения . )

17 голосов
/ 21 октября 2014

Я обнаружил, что лучший способ для https и www в домене -

RewriteCond %{HTTPS} off 
RewriteCond %{HTTPS_HOST} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
13 голосов
/ 30 апреля 2015

Это подход перенаправления html, он работает, но не лучший.

 <meta http-equiv="Refresh" content="0;URL=https://www.example.com" />

Подход PHP

<?php
function redirectTohttps() {
    if ($_SERVER['HTTPS']!="on") {
        $redirect= "https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
        header("Location:$redirect"); 
    } 
}
?>

.htaccess подход

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

скопировано: www.letuslook.org

8 голосов
/ 21 ноября 2014

Мне нравится этот метод перенаправления с http на https. Потому что мне не нужно редактировать его для каждого сайта.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
6 голосов
/ 31 марта 2016

Использование следующего кода в вашем файле .htaccess автоматически перенаправляет посетителей на HTTPS-версию вашего сайта:

RewriteEngine On

RewriteCond %{HTTPS} off

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

Если у вас есть файл .htaccess:

Не дублировать RewriteEngine On.

Убедитесь, что строки, начинающиеся с RewriteCond и RewriteRule, сразу следуют за уже существующим RewriteEngine On.

5 голосов
/ 22 февраля 2016

Это правильный метод перенаправления HTTP на HTTPS с использованием .htaccess в соответствии с GoDaddy.com. Первая строка кода не требует пояснений. Вторая строка кода проверяет, выключен ли HTTPS, и, если это так, перенаправляет HTTP на HTTPS, выполняя третью строку кода, в противном случае третья строка кода игнорируется.

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

https://www.godaddy.com/help/redirect-http-to-https-automatically-8828

5 голосов
/ 11 сентября 2016

Лучшее решение зависит от ваших требований. Это резюме ранее опубликованных ответов с добавлением некоторого контекста.

Если вы работаете с веб-сервером Apache и можете изменить его конфигурацию, следуйте документации Apache :

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

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

Но вы также спросили, можете ли вы сделать это в файле .htaccess. В этом случае вы можете использовать Apache RewriteEngine :

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]

Если все работает нормально и вы хотите, чтобы браузеры запомнили это перенаправление, вы можете объявить его постоянным, изменив последнюю строку на:

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

Но будьте осторожны, если вы можете передумать на этом перенаправлении. Браузеры запоминают это очень долго и не проверят, изменилось ли оно.

Вам может не понадобиться первая строка RewriteEngine On в зависимости от конфигурации веб-сервера.

Если вы ищете решение PHP, посмотрите на массив $ _ SERVER и функцию заголовка :

if (!$_SERVER['HTTPS']) {
    header("Location: https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']); 
} 
...