Как перенаправить все HTTP-запросы на HTTPS

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

20 ответов


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


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

источник


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

для перенаправления http URLs к 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 как задано в вопросе.

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


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

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

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

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

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

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


я узнал, что лучший способ для HTTPS и WWW на домен

RewriteCond %{HTTPS} off 
RewriteCond %{HTTPS_HOST} !^www.cheapcarhire.gr$ [NC]
RewriteRule ^(.*)$ https://www.cheapcarhire.gr/ [L,R=301]

это подход перенаправления 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 approch

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

скопировать из: www.letuslook.org


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

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

это правильный метод перенаправления 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


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

RewriteEngine On

RewriteCond %{HTTPS} off

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

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

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

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


добавьте следующий код .файл 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]

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

если вы работаете с веб-сервером 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>

но вы также спросили, можете ли вы сделать это в . В этом случае вы можете использовать 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']); 
} 

сделать все, что описано выше для перенаправления. Просто добавьте "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


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

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

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

Apache 2.4.

<if "%{HTTPS} !~ /on/">
Redirect / https://www.example.com/
</if>

через .htaccess это поможет.

RewriteEngine On


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

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

Также см. В этом более подробно. Как Перенаправить Http На Https?


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

<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:// или .чистых вместо .ком): https://nohodental.com/ (сайт я работаю на).


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


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

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

Если вы используете Apache, mod_rewrite, с простым решением и имеет много документации, как это сделать. Например: http://www.askapache.com/htaccess/http-https-rewriterule-redirect.html


другой край этой проблемы - когда в игру вступает балансировщик нагрузки.

ситуация следующая: - Трафик из браузера для балансировки нагрузки и обратно, является (должен быть) HTTPS - Трафик между балансировщиком нагрузки и фактическим веб-сервером-HTTP.

Итак, все переменные запроса сервера в PHP или Apache показывают, что соединение просто HTTP. И каталоги HTTP и HTTPS на сервере одинаковы.

в RewriteCondition в утвержденном ответа не действовать. Это дает либо цикл, либо просто не работает.

вопрос: Как заставить это работать на балансировщике нагрузки.

(или неправильно настроен балансировщик нагрузки. Это то, на что я надеюсь, потому что тогда я могу переместить проблему в компанию веб-хостинга: -))


Если вы используете веб-служб Amazon упругой балансировки нагрузки, который принимает 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-трафик на локальную машину разработки.