it-swarm.com.ru

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

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

254
Cat

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


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

Источник

262
Reese Moore

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

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

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

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

305
ssc

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

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

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

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

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

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

33
Bruno

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

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

Это подход html redirect, он работает, но не самый лучший.

 <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

12
Timothy Nwanwene

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

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

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

6
AnarchyOutlaw

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

Если вы работаете с веб-сервером 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 и функцию header :

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

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

RewriteEngine On

RewriteCond %{HTTPS} off

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

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

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

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

6
OpenWebWar

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

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

4
Waqas

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

3
F. Scott Gale

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

Если вам не нужен 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
SashaK

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

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

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

Apache 2.4.

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

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

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

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

0
vcsjones

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

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

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

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

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

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

0
BertC

возьми этот код тебе .htaccess файл Перенаправь HTTP на HTTPS автоматически

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

0
Ehsan Sattari

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

<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% {SERVER_PORT}! ^ 443 $ вместо RewriteCond% {HTTPS}! On

0
Intacto
 Redirect 301 / https://example.com/

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

Бонус:

ServerAlias www.example.com example.com

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

0
aalesund

Если вы используете Elastic Load Balancer Amazon Web Services, который принимает трафик 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-трафик на ваш локальный компьютер для разработки.

0
ScottyB