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

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

Ответы

Ответ 1

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


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

Источник

Ответ 2

Документы 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, как задано в вопросе.

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

Ответ 3

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 8

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

RewriteEngine On

RewriteCond %{HTTPS} off

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

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

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

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

Ответ 9

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

Ответ 10

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

Если вы работаете с веб-сервером 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']); 
} 

Ответ 11

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

Ответ 12

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

Ответ 13

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

Ответ 14

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

Ответ 15

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

Ответ 16

Если вам не нужен 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/ (сайт, над которым я работаю).

Ответ 17

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

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

Ответ 18

 Redirect 301 / https://example.com/

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

Бонус:

ServerAlias www.example.com example.com

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

Ответ 20

i am also trying to redirect my website from http to https, but its not working... website opens on both http and https 

this is the code i am using in my htaccess file 


# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !^/\.well-known/cpanel-dcv/[0-9a-zA-Z_-]+$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/(?:\ Ballot169)?
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/\.well-known/cpanel-dcv/[0-9a-zA-Z_-]+$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/(?:\ Ballot169)?
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule . /index.php [L]

</IfModule>

# END WordPress
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-SSL} !on
RewriteCond %{HTTP_HOST} ^www\.surffares\.com$
RewriteCond %{REQUEST_URI} !^/\.well-known/cpanel-dcv/[0-9a-zA-Z_-]+$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/(?:\ Ballot169)?
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^/?$ "https\:\/\/www\.surffares\.com\/" [R=301,L]

....... but this code is not working ... 

godaddy suggested to use this code 

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80
RewriteCond %{HTTP_HOST} ^(www\.)?coolexample\.com
RewriteRule ^(.*)$ https://www.coolexample.com/$1 [R,L]

but when i am using this code, my inner pages are not loading, only front page opening up, and working fine with https auto redirect, but no other inner page is loading... customer support told you need to pull inner pages in .htaccess...

can you help how to do it? 

Ответ 21

Если вы хотите сделать это с сервера Tomcat, выполните следующие действия

На автономном HTTP-сервере Apache Tomcat (8.5.x) его можно настроить таким образом, чтобы, если пользователь вводит www.domain.com, они автоматически перенаправлялись на сайт https (www.domain.com).

Двухэтапный метод включения следующего в ваш [Tomcat_base]/conf/web.xml перед закрывающим тегом

step 1: 
<security-constraint>
<web-resource-collection>
<web-resource-name>HTTPSOnly</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>

и настройте параметры коннектора [Tomcat_base]/conf/server.xml:

step 2:
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="443"/>
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="[keystorelocation]" type="RSA" />
</SSLHostConfig>
</Connector>

Примечание. Если вы уже выполнили настройку https и пытаетесь перенаправить, выполните только шаг 1.

Ответ 23

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

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

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

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

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

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

Ответ 24

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

Ответ 25

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

<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 $

Ответ 26

Это перенаправляет все 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]