Принудительное использование 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 файл

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();
    }
}

нашел mod_rewrite решение, которое работает хорошо для проксируемых серверов и unproxied.

Если вы используете 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]

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
  • http://www.website.com

    RewriteCond %{HTTPS} off
    RewriteCond %{HTTPS_HOST} !^www.website.com$ [NC]
    RewriteRule ^(.*)$ https://www.website.com/ [L,R=301]
    

простой и легкий, просто добавьте следующие

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]