Принудительное использование SSL / https.htaccess и mod переписать
Как я могу принудительно использовать SSL /https.htaccess и mod_rewrite страница специфична в PHP.
10 ответов:
для Apache, вы можете использовать
mod_ssl
для принудительного SSL сSSLRequireSSL Directive
:эта директива запрещает доступ, если HTTP через SSL (т. е. HTTPS) не включен для текущего соединения. Это очень удобно внутри виртуального хоста или каталогов с поддержкой SSL для защиты от ошибок конфигурации, которые предоставляют материал, который должен быть защищен. Когда эта директива присутствует все запросы отклоняются, которые не используют использование SSL.
это не будет делать перенаправление на https, хотя. Чтобы перенаправить, попробуйте выполнить следующие действия с помощью
mod_rewrite
в свой .htaccess fileRewriteEngine 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(); } }
нашел
mod_rewrite
решение, которое хорошо работает как для проксированных, так и для непроксированных серверов.Если вы используете CloudFlare, AWS Elastic Load Balancing, 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]
PHP решение
заимствуя непосредственно из очень исчерпывающего ответа Гордона, я отмечаю, что ваш вопрос упоминает о том, что он зависит от страницы при принудительном подключении 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()
централизованный файл, содержащий эту (и любые другие) пользовательские функции, а затем просто запустите .откройте файл. htaccess / mod_rewrite, с решением
I лично я не реализовал такого рода решение (я склонен использовать решение 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-переписать решение на основе:
используя следующий код в htaccess автоматически пересылает все http-запросы на https.
RewriteEngine on RewriteCond %{HTTPS}::%{HTTP_HOST} ^off::(?:www\.)?(.+)$ RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R]
Это позволит перенаправить non-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.
Я просто хотел бы отметить, что Apache имеет хуже правила наследования при использовании нескольких .htaccess файлы по всей глубине каталога. Два ключевых подводных камня:
- только правила, содержащиеся в глубокие .файл htaccess будет выполнен по умолчанию. Вы должны указать
RewriteOptions InheritDownBefore
директива (или аналогичная), чтобы изменить это. (см. вопрос)- шаблон применяется к пути к файлу относительно подкаталога, а не к верхнему каталог, содержащий .htaccess файл с данным правилом. (см. Описание)
это означает предлагаемое глобальное решение на 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/
этот код работает для меня
RewriteEngine On RewriteBase / RewriteCond %{HTTP:X-HTTPS} !1 RewriteRule ^(.*)$ https://%{HTTP_HOST}/ [R=301,L]
просто :
RewriteEngine on RewriteCond %{HTTP_HOST} ^(www\.example\.com)(:80)? [NC] RewriteRule ^(.*) https://example.com/ [R=301,L] order deny,allow
замените свой url-адрес example.com
для простого принудительного SSL с Apache .htaccess вы можете использовать
SSLOptions +StrictRequire SSLRequireSSL
для перенаправления выше ответ правильный
попробуйте этот код, он будет работать для всех версий URL-адресов, таких как
- website.com
- www.website.com
- http://website.com
RewriteCond %{HTTPS} off RewriteCond %{HTTPS_HOST} !^www.website.com$ [NC] RewriteRule ^(.*)$ https://www.website.com/ [L,R=301]