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

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

189
задан 03 нояб. '10 в 3:14
источник поделиться
18 ответов

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


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

Источник

190
ответ дан 03 нояб. '10 в 3:16
источник

Документы Apache рекомендуют не использовать переписывание:

Чтобы перенаправить URL http на 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, как задано в вопросе.

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

232
ответ дан 15 февр. '14 в 17:34
источник

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

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
78
ответ дан 30 дек. '15 в 2:05
источник

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

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

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

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

27
ответ дан 03 нояб. '10 в 3:36
источник

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

RewriteCond %{HTTPS} off 
RewriteCond %{HTTPS_HOST} !^www.cheapcarhire.gr$ [NC]
RewriteRule ^(.*)$ https://www.cheapcarhire.gr/$1 [L,R=301]
13
ответ дан 21 окт. '14 в 13:42
источник

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

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
8
ответ дан 21 нояб. '14 в 11:37
источник

Это подход переадресации 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

7
ответ дан 30 апр. '15 в 2:20
источник

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

RewriteEngine On

RewriteCond %{HTTPS} off

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

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

Не дублируйте RewriteEngine On.

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

6
ответ дан 31 марта '16 в 16:26
источник

Это правильный метод перенаправления 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
ответ дан 22 февр. '16 в 19:22
источник

Добавьте следующий код в файл .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]
5
ответ дан 28 сент. '14 в 18:44
источник

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

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

if (!$_SERVER['HTTPS']) {
    header("Location: https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']); 
} 
4
ответ дан 11 сент. '16 в 12:14
источник

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

Отредактируйте конфигурационный файл apache (например,/etc/apache2/sites-enabled/website.conf и /etc/apache 2/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

3
ответ дан 22 авг. '15 в 1:23
источник

Через .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?

3
ответ дан 17 дек. '16 в 12:23
источник

Чтобы перенаправить все запросы 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>
2
ответ дан 02 июля '16 в 16:46
источник

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

<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/ (сайт, над которым я работаю).

2
ответ дан 07 февр. '17 в 0:53
источник

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

0
ответ дан 03 нояб. '10 в 3:16
источник

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

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

0
ответ дан 28 окт. '17 в 18:00
источник

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

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

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

RewriteCondition в одобренном ответе не работает. Он дает либо цикл, либо просто не работает.

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

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

0
ответ дан 17 июля '15 в 14:41
источник

Другие вопросы по меткам или Задайте вопрос