Wymuś użycie SSL / https.htaccess i mod rewrite

Jak mogę wymusić SSL/https za pomocą .htaccess i mod_rewrite strona specyficzna w PHP.

Author: lpd, 2010-12-09

10 answers

Dla Apache, można użyć mod_ssl aby wymusić SSL z SSLRequireSSL Directive:

Niniejsza dyrektywa zabrania dostępu, chyba że HTTP przez SSL (tj. HTTPS) jest włączone dla bieżącego połączenia. Jest to bardzo przydatne wewnątrz hosta wirtualnego lub katalogów z obsługą SSL w celu obrony przed błędami konfiguracji, które ujawniają rzeczy, które powinny być chronione. Gdy ta dyrektywa jest obecna, wszystkie żądania są odrzucane, które nie używają protokołu SSL.

To nie spowoduje przekierowania do jednak https. Aby przekierować, spróbuj wykonać następujące czynności mod_rewrite w Twoim .plik htaccess

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Lub którekolwiek z różnych podejść podanych w

Możesz również rozwiązać ten problem z poziomu PHP, jeśli twój dostawca wyłączył .htaccess (co jest mało prawdopodobne, ponieważ poprosiłeś o to, ale w każdym razie)

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();
    }
}
 392
Author: Gordon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-13 16:12:18

Znalazłem mod_rewrite rozwiązanie, które działa dobrze zarówno dla serwerów proxy, jak i nieproxy.

Jeśli używasz CloudFlare, AWS Elastic Load Balancing, Heroku, OpenShift lub innego rozwiązania Cloud/PaaS i doświadczasz pętli przekierowania z normalnymi przekierowaniami HTTPS, spróbuj zamiast tego poniższego fragmentu.

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]
 42
Author: raphinesse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-20 11:46:10

PHP Solution

Zapożyczając bezpośrednio z bardzo wyczerpującej odpowiedzi Gordona, zauważam, że twoje pytanie wspomina o tym, że strona jest specyficzna w wymuszaniu połączeń 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>' );
    }
  }
}

Następnie, w pobliżu góry tych stron, które chcesz zmusić do połączenia przez PHP, Możesz require() scentralizowany plik zawierający tę (i inne) funkcje niestandardowe, a następnie po prostu uruchomić funkcję forceHTTPS().

Rozwiązanie HTACCESS / mod_rewrite

Nie wdrożyłem tego rodzaju rozwiązanie osobiście (miałem tendencję do korzystania z rozwiązania PHP, jak ten powyżej, dla jego prostoty), ale poniżej może być, przynajmniej, dobry początek.

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]
 34
Author: Luke Stevenson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-09 16:04:09

Rozwiązanie oparte na Mod-rewrite:

Użycie poniższego kodu w htaccess automatycznie przekazuje wszystkie żądania http do https.

RewriteEngine on

RewriteCond %{HTTPS}::%{HTTP_HOST} ^off::(?:www\.)?(.+)$
RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R]
W tym celu należy skontaktować się z działem obsługi klienta pod adresem: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,

Another solution (Apache 2.4*)

RewriteEngine on

RewriteCond %{REQUEST_SCHEME}::%{HTTP_HOST} ^http::(?:www\.)?(.+)$
RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R]

To nie działa na niższych wersjach apache, ponieważ zmienna %{REQUEST_SCHEME} została dodana do mod-rewrite od 2.4.

 7
Author: starkeen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-12 07:54:03

Chciałbym tylko zaznaczyć, że Apache ma najgorsze zasady dziedziczenia przy użyciu wielu .pliki htaccess w głębi katalogu. Dwie kluczowe pułapki:

  • tylko zasady zawarte w najgłębszych .plik htaccess będzie wykonywany domyślnie. Aby to zmienić, musisz podać dyrektywę RewriteOptions InheritDownBefore (lub podobną). (patrz pytanie)
  • wzorzec jest stosowany do ścieżki pliku względem podkatalogu, a nie górnego katalogu zawierającego .plik htaccess z podaną zasadą. (patrz dyskusja)

Oznacza to, że sugerowane globalne rozwiązanie na Apache Wiki nie działa , Jeśli używasz innych .pliki htaccess w podkatalogach. Napisałem zmodyfikowaną wersję, która działa:

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/
 6
Author: lpd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:58

Ten kod działa dla mnie

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP:X-HTTPS} !1
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
 0
Author: Alexufo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-11 15:18:52

Prosty:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.example\.com)(:80)? [NC]
RewriteRule ^(.*) https://example.com/$1 [R=301,L]
order deny,allow

Zamień swój adres url na example.com

 0
Author: Sepehr Norouzi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-28 10:45:29

Za samo wymuszanie SSL z Apache .htaccess możesz użyć

SSLOptions +StrictRequire
SSLRequireSSL

Dla przekierowania powyższa odpowiedź jest poprawna

 0
Author: webdesignwien,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-17 11:15:07

Wypróbuj ten kod, będzie działał dla wszystkich wersji adresów URL, takich jak

 0
Author: Kashif Latif,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-13 09:44:04

Proste i łatwe , wystarczy dodać następujące

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
 0
Author: Saurabh Mistry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-20 12:02:51