Я пытаюсь перенаправить все незащищенные HTTP-запросы на моем сайте (например http://www.example.com
) в HTTPS ( https://www.example.com
). Я использую PHP, кстати. Могу ли я сделать это в .htaccess?
http://
Я пытаюсь перенаправить все незащищенные HTTP-запросы на моем сайте (например http://www.example.com
) в HTTPS ( https://www.example.com
). Я использую PHP, кстати. Могу ли я сделать это в .htaccess?
http://
Ответы:
Обновление: хотя этот ответ был принят несколько лет назад, обратите внимание, что его подход в настоящее время рекомендуется в документации Apache. Используйте Redirect
вместо. Смотрите этот ответ .
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
http://server/foo?email=someone%40example.com
переадресация на https://server/foo?email=someone%2540example.com
т. Е. Знак "@" получает URL-кавычки дважды . Использование метода в ответе @ ssc не имеет этой проблемы.
In the case of the http-to-https redirection, the use of RewriteRule would be appropriate if you don't have access to the main server configuration file, and are obliged to perform this task in a .htaccess file instead.
Документы 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
что задано в вопросе.
Эта статья могла появиться только после того, как на вопрос был задан и дан ответ, но, похоже, это актуальный путь.
permanent
ключевое слово, эффект тот же (браузер получает перенаправление 301). Например:Redirect permanent "/" "https://example.com"
Я бы рекомендовал с 301 редиректом:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
[L]
Как я уже говорил в этом вопросе , я бы посоветовал вам не перенаправлять все HTTP-запросы к их HTTPS-эквиваленту вслепую, так как это может вызвать у вас ложное впечатление о безопасности. Вместо этого вам, вероятно, следует перенаправить «корень» вашего сайта HTTP в корень вашего сайта HTTPS и ссылаться оттуда только на HTTPS.
Проблема заключается в том, что если какая-либо ссылка или форма на сайте HTTPS заставляет клиента отправить запрос на сайт HTTP, его содержимое будет видно до перенаправления.
Например, если одна из ваших страниц, обслуживаемых по HTTPS, имеет форму, которая сообщает <form action="http://example.com/doSomething">
и отправляет некоторые данные, которые не следует отправлять в незашифрованном виде, браузер сначала отправит полный запрос (включая сущность, если это POST) на сайт HTTP первый. Перенаправление будет немедленно отправлено в браузер, и, поскольку большое количество пользователей отключает или игнорирует предупреждения, оно, вероятно, будет проигнорировано.
Конечно, ошибка предоставления ссылок, которые должны быть на сайт HTTPS, но которые в конечном итоге принадлежат сайту HTTP, может вызвать проблемы, как только вы услышите что-то, прослушивающее порт HTTP на том же IP-адресе, что и ваш сайт HTTPS. Тем не менее, я думаю, что сохранение этих двух сайтов в качестве «зеркала» только увеличивает вероятность ошибок, поскольку вы можете предположить, что он самокорректируется, перенаправляя пользователя на HTTPS, в то время как часто бывает слишком поздно. (В этом вопросе были похожие обсуждения . )
Я обнаружил, что лучший способ для https и www на домене
RewriteCond %{HTTPS} off
RewriteCond %{HTTPS_HOST} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
http://www.example.com/...
потому что два условия неявно AND'd. Вместо этого они должны быть OR, т.е. включите OR
флаг в первое условие (и не забывайте избегать буквальных точек в регулярном выражении). Но если вы реализуете HSTS, то вы не хотите перенаправлять на HTTPS и www в одном перенаправлении, вам следует сначала перенаправить на 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
.htaccess
идет? Кроме того, эта ссылка не работает.
Мне нравится этот метод перенаправления с http на https. Потому что мне не нужно редактировать его для каждого сайта.
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
Использование следующего кода в вашем файле .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
Лучшее решение зависит от ваших требований. Это сводка ранее опубликованных ответов с добавлением некоторого контекста.
Если вы работаете с веб-сервером 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
файл?
Добавьте следующий код в файл .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]
Сделайте все, что описано выше для перенаправления. Просто добавьте «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
inside if
для перенаправления http
запросов https
.
Апач 2.4.
<if "%{HTTPS} !~ /on/">
Redirect / https://www.example.com/
</if>
Если вы находитесь в ситуации, когда вы не можете получить доступ к конфигурации 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 рекомендует не использовать этот метод, где это возможно. Однако для обеспечения безопасности данных вашего пользователя требуется дополнительная проверка в конце разработки. Надеемся, что это поможет кому-то еще, кому, возможно, придется изучить использование нерекомендованных методов из-за ограничений нашего хостинга.
Через .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 для других целей, использование основной директивы 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/ (сайт, над которым я работаю).
Возьми этот код тебе .htaccess файл Перенаправь HTTP на HTTPS автоматически
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Я нашел способ заставить все страницы моего сайта перенаправлять с http на аналог страниц на https, которые работают для меня.
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Это перенаправляет все 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]
Если вы хотите сделать это с сервера 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.
Если вы используете Apache, mod_rewrite - самое простое решение, и в нем есть много документации, как это сделать. Например: http://www.askapache.com/htaccess/http-https-rewriterule-redirect.html
Другое преимущество этой проблемы - когда в игру вступает балансировщик нагрузки.
Ситуация выглядит следующим образом: - Трафик между браузером и балансировщиком нагрузки и обратно - это (должен быть) HTTPS - Трафик между балансировщиком нагрузки и реальным WebServer - HTTP.
Итак, все переменные запроса сервера в PHP или Apache показывают, что соединение является просто HTTP. И каталоги HTTP и HTTPS на Сервере одинаковы.
RewriteCondition в утвержденном ответе не работает. Это дает либо цикл, либо он просто не работает.
Вопрос: как заставить это работать на Балансировщике Нагрузки.
(Или неправильно настроен балансировщик нагрузки. На это я и надеюсь, потому что тогда я смогу перенести проблему в компанию WebHosting :-))
Если вы используете Elastic Load Balancer Amazon Web Services, который принимает трафик https и направляет его на ваш сервер (ы) с http, правильный способ перенаправления всего трафика http на https описан здесь: https://aws.amazon. ком / premiumsupport / знание-центр / редирект-клиент по протоколу 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-трафик на ваш локальный компьютер для разработки.
Меня устраивает:
<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 $
httpd
, а не через PHP.