Для Apache вы можете использовать mod_ssl
для принудительного SSL с помощью SSLRequireSSL Directive
:
Эта директива запрещает доступ, если только HTTP over SSL (т.е. HTTPS) включен для текущего соединения. Это очень удобно внутри виртуального хоста или каталогов с поддержкой SSL для защиты от ошибок конфигурации, которые выставляют материал, который должен быть защищен. Когда эта директива присутствует, все запросы отклоняются, которые не используют SSL.
blockquote>Это не будет делать переадресацию на https. Чтобы перенаправить, попробуйте следующее с
mod_rewrite
в вашем файле .htaccessRewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
или любом из различных подходов, приведенных в
Вы также можете решить это из PHP в случае, если ваш провайдер отключил .htaccess (что маловероятно, так как вы его просили, но в любом случае)
if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] !== 'on') { if(!headers_sent()) { header("Status: 301 Moved Permanently"); header(sprintf( 'Location: https://%s%s', $_SERVER['HTTP_HOST'], $_SERVER['REQUEST_URI'] )); exit(); } }
Этот код работает для меня
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP:X-HTTPS} !1
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
Я хотел бы отметить, что Apache имеет худшие правила наследования при использовании нескольких файлов .htaccess в глубинах каталогов. Две ключевые ошибки:
RewriteOptions InheritDownBefore
(или аналогичную), чтобы изменить это. (см. вопрос) Это означает, что предлагаемое глобальное решение на Apache Wiki работает не , если вы используете любые другие файлы .htaccess в подкаталогах. Я написал модифицированную версию, которая делает:
RewriteEngine On
# This will enable the Rewrite capabilities
RewriteOptions InheritDownBefore
# This prevents the rule from being overrided by .htaccess files in subdirectories.
RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [QSA,R,L]
# This rule will redirect users from their original location, to the same location but using HTTPS.
# i.e. http://www.example.com/foo/ to https://www.example.com/foo/
Решение на основе mod-rewrite:
Используя следующий код в htaccess, автоматически пересылает все HTTP-запросы на https.
RewriteEngine on
RewriteCond %{HTTPS}::%{HTTP_HOST} ^off::(?:www\.)?(.+)$
RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R]
Это перенаправит ваши не-www и www http запросы на www-версию https.
Другое решение (Apache 2.4 *)
RewriteEngine on
RewriteCond %{REQUEST_SCHEME}::%{HTTP_HOST} ^http::(?:www\.)?(.+)$
RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R]
Это не работает в более низких версиях apache, поскольку переменная% {REQUEST_SCHEME} была добавлена в mod-rewrite с 2.4.
попробуйте этот код, он будет работать для всех версий URL, таких как
RewriteCond %{HTTPS} off
RewriteCond %{HTTPS_HOST} !^www.website.com$ [NC]
RewriteRule ^(.*)$ https://www.website.com/$1 [L,R=301]
Заимствуя непосредственно из очень полного ответа Гордона, я отмечаю, что в вашем вопросе упоминается, что он зависит от страницы при форсировании соединений HTTPS / SSL.
function forceHTTPS(){
$httpsURL = 'https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
if( count( $_POST )>0 )
die( 'Page should be accessed with HTTPS, but a POST Submission has been sent here. Adjust the form to point to '.$httpsURL );
if( !isset( $_SERVER['HTTPS'] ) || $_SERVER['HTTPS']!=='on' ){
if( !headers_sent() ){
header( "Status: 301 Moved Permanently" );
header( "Location: $httpsURL" );
exit();
}else{
die( '<script type="javascript">document.location.href="'.$httpsURL.'";</script>' );
}
}
}
Затем, как рядом с этими страницами, которые вы хотите принудительно подключить через PHP, вы можете require()
создать централизованный файл, содержащий эту (и любые другие) пользовательские функции, а затем просто запустить функцию forceHTTPS()
.
Я не реализовал это решение лично (я имел тенденцию использовать решение PHP, как и выше, для его простоты), но может быть, по крайней мере, , хорошее начало.
RewriteEngine on
# Check for POST Submission
RewriteCond %{REQUEST_METHOD} !^POST$
# Forcing HTTPS
RewriteCond %{HTTPS} !=on [OR]
RewriteCond %{SERVER_PORT} 80
# Pages to Apply
RewriteCond %{REQUEST_URI} ^something_secure [OR]
RewriteCond %{REQUEST_URI} ^something_else_secure
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
# Forcing HTTP
RewriteCond %{HTTPS} =on [OR]
RewriteCond %{SERVER_PORT} 443
# Pages to Apply
RewriteCond %{REQUEST_URI} ^something_public [OR]
RewriteCond %{REQUEST_URI} ^something_else_public
RewriteRule .* http://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
Я нашел решение mod_rewrite
, которое хорошо работает как для проксированных, так и для непропитанных серверов.
Если вы используете CloudFlare, балансировку балансировки нагрузки AWS, Heroku, OpenShift или любые другое решение Cloud / PaaS, и вы испытываете петли перенаправления с обычными переадресациями HTTPS, попробуйте вместо этого следующий фрагмент.
RewriteEngine On
# If we receive a forwarded http request from a proxy...
RewriteCond %{HTTP:X-Forwarded-Proto} =http [OR]
# ...or just a plain old http request directly from the client
RewriteCond %{HTTP:X-Forwarded-Proto} =""
RewriteCond %{HTTPS} !=on
# Redirect to https version
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Просто и просто, просто добавьте следующие
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Простой:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.example\.com)(:80)? [NC]
RewriteRule ^(.*) https://example.com/$1 [R=301,L]
order deny,allow
заменить ваш url example.com
для принудительного использования SSL с Apache .htaccess вы можете использовать
SSLOptions +StrictRequire
SSLRequireSSL
для перенаправления вышеуказанного ответа правильно