Как перенаправить все HTTP-запросы в HTTPS
Я пытаюсь перенаправить все незащищенные HTTP-запросы на моем сайте (например, http://www.example.com
) в HTTPS (https://www.example.com
). Я использую PHP, кстати. Могу ли я сделать это в.htaccess?
31 ответ
Обновление: хотя этот ответ был принят несколько лет назад, обратите внимание, что его подход теперь рекомендуется в документации Apache. Использовать Redirect
вместо. Смотрите этот ответ.
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Документы Apache рекомендуют не использовать переписывание:
Перенаправить
http
URL к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 редиректом:
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">
и отправляет некоторые данные, которые не следует отправлять в незашифрованном виде, браузер сначала отправит полный запрос (включая сущность, если это POST) на сайт HTTP. Перенаправление будет немедленно отправлено в браузер, и, поскольку большое количество пользователей отключает или игнорирует предупреждения, оно, вероятно, будет проигнорировано.
Конечно, ошибка предоставления ссылок, которые должны быть на сайт HTTPS, но которые в конечном итоге принадлежат сайту HTTP, может вызвать проблемы, как только вы услышите что-то, прослушивающее порт HTTP на том же IP-адресе, что и ваш сайт HTTPS. Тем не менее, я думаю, что сохранение двух сайтов в качестве "зеркала" только увеличивает вероятность ошибок, так как вы можете предположить, что он самокорректируется, перенаправляя пользователя на HTTPS, хотя это часто слишком поздно. (В этом вопросе были похожие обсуждения .)
Это подход 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
Я узнал, что лучший способ для https и www на домене
RewriteCond %{HTTPS} off
RewriteCond %{HTTPS_HOST} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
Мне нравится этот метод перенаправления с http на https. Потому что мне не нужно редактировать его для каждого сайта.
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{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>
Но вы также спросили, можете ли вы сделать это в .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']);
}
Использование следующего кода в вашем файле.htaccess автоматически перенаправляет посетителей на HTTPS-версию вашего сайта:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Если у вас есть файл.htaccess:
Не дублируйте RewriteEngine On.
Убедитесь, что строки, начинающиеся с RewriteCond и RewriteRule, следуют сразу за уже существующим RewriteEngine On.
Это правильный метод перенаправления 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:
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 документируют, что вы должны использовать их параметры конфигурации в первую очередь над 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 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
,
Апач 2.4.
<if "%{HTTPS} !~ /on/">
Redirect / https://www.example.com/
</if>
Через.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?
Если вам не нужен mod_rewrite для других целей, использование основной директивы Apache IF чище и быстрее:
<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
Чтобы увидеть его в действии (попробуйте без www. Или https: //, или с.net вместо.com): https://nohodental.com/ (сайт, над которым я работаю).
Я нашел способ заставить все страницы моего сайта перенаправить с http на аналог страниц на https, которые работают для меня.
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Возьми этот код тебе.htaccess файл Перенаправь HTTP на HTTPS автоматически
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Redirect 301 / https://example.com/
(работал для меня, когда ни один из приведенных выше ответов не работал)
Бонус:
ServerAlias www.example.com example.com
(исправлено: https: //www.example.com не найдено)
Вышеуказанные вещи относятся только к серверу Apache. Что, если запустить PHP на Tomcat?
Таким образом, вы можете использовать PHP-код, будь то Apache / tomcat / Nginx и т. Д.
if (!((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
$_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'))){
$redirect = 'https://' . str_replace($_SERVER['SERVER_PORT'], 8443, $_SERVER['HTTP_HOST']) . $_SERVER['REQUEST_URI'];
header('HTTP/1.1 301 Moved Permanently');
header('Location: ' . $redirect);
exit();
}
После множества попыток, рассматривая без www и с www, это работает
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} (www\.)?yourdomain.com
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Я перепробовал все
.htaccess
конфигурации, которые я мог найти в Интернете, но ни одна из них не работала. Затем я понял, что Apache не рекомендует использовать
mod_rewrite
.
Мое решение заключалось в том, чтобы отредактировать файлы конфигурации apache в следующей папке:
/etc/apache2/sites-enabled
У вас будет один обязательный файл с именем и файл конфигурации ssl с именем (если вы установили сертификат ssl из letsencrypt / certbot). Однако эти файлы могут называться по-разному в зависимости от имен файлов, которые вы указали при настройке сайта.
В
000-default.conf
, Я отредактировал следующее внутри как:
В
000-default-le-ssl.conf
, Я отредактировал следующее внутри
<VirtualHost *:80>
в качестве:
<VirtualHost *:80>
ServerName example.com
Redirect / https://example.com/
</VirtualHost>
Никакого другого перенаправления не требуется.
Сохраните файл, затем перезапустите сервер Apache, используя
sudo service apache2 restart
На самом деле я пытался заставить это работать на экземпляре EC2 без балансировщика нагрузки, поскольку это стоит денег. Я везде читал, что .htaccess не является «правильным» способом сделать это. Очевидно, это сработает, но я старался придерживаться правил. Я следовал всем примерам, чтобы обновить файл httpd.conf и добавить много ненужного. Оказывается, единственная строка, которая вам действительно нужна, это:
Redirect permanent / https://www.yourdomain.com
Моя проблема заключалась в том, что изначально я добавил это в тег VirtualHost внутри httpd.conf, о чем вам говорят во многих сообщениях, но это не сработало. Оказывается, в /etc/httpd/conf.d хранился отдельный файл conf с именем yourdomain.conf, который уже имел тег VirtualHost и переопределял мои настройки httpd.conf. Я просто добавил указанную выше строку внутри него и вуаля, он мгновенно перенаправился на https. Нет необходимости в отдельном VirtualHost для порта 443.
Теперь он работает, и тег VirtualHost выглядит так:
<VirtualHost *:80>
ServerName yourdomain.com
DocumentRoot /var/www/html
ServerAlias www.yourdomain.com
ErrorLog /var/www/error.log
CustomLog /var/www/requests.log combined
Redirect permanent / https://www.yourdomain.com
</VirtualHost>
Примечание. У меня уже была настройка TLS с БЕСПЛАТНЫМ сертификатом от certbot (обожаю этих парней), и я просто пытался перенаправить обычные http-вызовы на работающий https-сайт.
Если вы используете Apache, mod_rewrite - самое простое решение, и в нем есть много документации, как это сделать. Например: http://www.askapache.com/htaccess/http-https-rewriterule-redirect.html
Меня устраивает:
<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$
Если вы используете эластичный балансировщик нагрузки веб-служб Amazon, который принимает трафик 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-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-трафик на ваш локальный компьютер для разработки.
Другое преимущество этой проблемы - когда в игру вступает Балансировщик нагрузки.
Ситуация выглядит следующим образом: - Трафик между браузером и балансировщиком нагрузки и обратно - это (должен быть) HTTPS - Трафик между балансировщиком нагрузки и реальным WebServer - HTTP.
Итак, все переменные запроса к серверу в PHP или Apache показывают, что соединение является просто HTTP. И каталоги HTTP и HTTPS на Сервере одинаковы.
RewriteCondition в утвержденном ответе не работает. Это дает либо цикл, либо он просто не работает.
Вопрос: как заставить это работать на Балансировщике Нагрузки.
(Или неправильно настроен балансировщик нагрузки. Это то, на что я надеюсь, потому что тогда я могу перенести проблему в компанию WebHosting:-))
Вы можете сделать это не только в файле.htaccess, но и в этот период. Вы также захотите выполнить приведенные здесь шаги, чтобы ваш сайт был включен в список предварительной загрузки HSTS после того, как вы реализуете это перенаправление, чтобы любые запросы к небезопасной http-версии вашего сайта никогда не проходили мимо пользовательского агента. Вместо этого пользовательский агент проверяет запрошенный URI по встроенному списку веб-сайтов только с https и, если запрошенный URI находится в этом списке, изменяет протокол с http на https перед передачей запроса на сервер. Таким образом, небезопасный запрос никогда не выходит в открытый доступ и никогда не попадает на сервер. В конце концов, когда Интернет перейдет на https, только список предварительной загрузки HSTS не понадобится. А пока его должны использовать все сайты.
Чтобы выполнить перенаправление, нам нужно включить механизм перезаписи, а затем перенаправить весь трафик с http-порта 80 на https.
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://yourwebsite.tld/$1 [L,R=301]
Если вы хотите сделать это с сервера 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.
В случае перенаправления http-to-https использование RewriteRule будет уместным, если у вас нет доступа к основному файлу конфигурации сервера и вместо этого вы обязаны выполнить эту задачу в файле .htaccess.