Я пытаюсь перенаправить все небезопасные HTTP-запросы на моем сайте (например, http://www.example.com
) на HTTPS (https://www.example.com
). Я использую PHP кстати. Могу ли я сделать это в .htaccess?
Как перенаправить все HTTP-запросы на HTTPS
Ответ 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 не найдено)
Ответ 19
Возьми этот код тебе .htaccess файл Перенаправь HTTP на HTTPS автоматически
RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Ответ 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.
Ответ 22
Если вы используете Apache, mod_rewrite - это самое простое решение, и у него есть много документации в Интернете, как это сделать. Например: http://www.askapache.com/htaccess/http-https-rewriterule-redirect.html
Ответ 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]