Як я можу примусити SSL / https, використовуючи .htaccess та mod_rewrite сторінки, специфічні в PHP.
Як я можу примусити SSL / https, використовуючи .htaccess та mod_rewrite сторінки, специфічні в PHP.
Відповіді:
Для Apache ви можете використовувати mod_ssl
для примусового використання SSL за допомогою SSLRequireSSL Directive
:
Ця директива забороняє доступ, якщо для поточного з'єднання не ввімкнено протокол HTTP через SSL (тобто HTTPS). Це дуже зручно всередині віртуального хоста або підтримуваних SSL програм для захисту від помилок конфігурації, які викривають речі, які слід захистити. Коли ця директива присутня, всі запити відмовляються, які не використовують SSL.
Це не зробить переспрямування на https. Щоб перенаправити, спробуйте наступне mod_rewrite
у вашому файлі .htaccess
RewriteEngine 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();
}
}
%{HTTP:X-Forwarded-Proto}
або %{HTTP:X-Real-Port}
змінні, щоб перевірити, чи включений SSL.
RewriteRule <input-pattern> <output-url>
. Таким чином, простір повинен бути там, і сингл ^
просто говорить "відповідати всім вхідним URL-адресам".
Я знайшов 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]
Позичаючись безпосередньо з дуже вичерпної відповіді Гордона, зауважу, що ваше запитання зазначає специфіку сторінки, примушуючи 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]
RewriteCond %{REQUEST_METHOD} !^POST$
?
RewriteCond %{REQUEST_METHOD} !^POST$
повинен запобігати впливу цих переспрямувань на подання POST.
Рішення на основі мод-переписування:
Використовуючи наступний код у 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} додана до мод-переписати з 2.4.
Я просто хотів би зазначити, що 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/
Просто та легко, просто додайте наступне
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
для перенаправлення наведена відповідь правильна
спробуйте цей код, він буде працювати для всіх версій URL-адрес, таких як
RewriteCond %{HTTPS} off
RewriteCond %{HTTPS_HOST} !^www.website.com$ [NC]
RewriteRule ^(.*)$ https://www.website.com/$1 [L,R=301]