"31.181.118.154 - 31.181.118.154"

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

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

261
03 нояб. '10 в 3:14
источник поделиться
23 ответов

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


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

Источник

268
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, как задано в вопросе.

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

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

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

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
124
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, тогда как часто слишком поздно. (Были аналогичные обсуждения в этом вопросе.)

33
03 нояб. '10 в 3:36
источник

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

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

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

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

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

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

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

6
22 февр. '16 в 19:22
источник

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

Если вы работаете с веб-сервером 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']); 
} 
6
11 сент. '16 в 12:14
источник

Использование следующего кода в вашем файле .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
источник

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

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

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

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

3
28 окт. '17 в 18:00
источник

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

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

2
17 дек. '16 в 12:23
источник
 Redirect 301 / https://example.com/

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

Бонус:

ServerAlias www.example.com example.com

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

1
20 марта '19 в 11:32
источник

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

RewriteEngine On 
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
1
03 июля '18 в 23:36
источник

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

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

Это перенаправляет все URL-адреса на https и www

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTPS_HOST} !^www.example.com$ [NC,OR]
RewriteCond %{HTTP_HOST} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
0
15 апр. '19 в 22:33
источник

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

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

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

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

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

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

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

Меня устраивает:

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

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

0
01 нояб. '18 в 21:30
источник

Если вы используете балансировщик эластичной нагрузки Amazon Web Services, который принимает трафик https и направляет его на ваш сервер (-ы) с помощью http, правильный способ перенаправления всего трафика http на https описан здесь: https://aws.amazon. ком /premiumsupport/знание-центр/перенаправление HTTP-HTTPS-ELB-

Используйте заголовок X-Forwarded-Proto (содержит http или https), который всегда включен в http-запросы от балансировщика нагрузки, как описано здесь: https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/x- пересылаются-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
07 июля '18 в 1:31
источник

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