Force SSL / HTTPS met .htaccess en mod_rewrite

Hoe kan ik naar SSL / HTTPS forceren met .htaccess en mod_rewrite-pagina die specifiek is in PHP.


Antwoord 1, Autoriteit 100%

Voor Apache kunt u mod_sslOm SSL te forceren met de SSLRequireSSL Directive:

Deze richtlijn verbiedt toegang tenzij HTTP over SSL (d.w.z. https) is ingeschakeld voor de huidige verbinding. Dit is erg handig in de SSL-ingeschakelde virtuele host of directory’s voor het verdedigen tegen configuratiefouten die spullen blootstellen die moeten worden beschermd. Wanneer deze richtlijn aanwezig is, worden alle verzoeken geweigerd die geen SSL gebruiken.

Hierdoor wordt echter geen omleiding naar https. Om door te sturen, probeer dan het volgende met mod_rewritein uw .htaccess-bestand

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

of een van de verschillende benaderingen in

U kunt dit ook vanaf binnen PHP oplossen in het geval dat uw provider is uitgeschakeld .Htaccess (wat onwaarschijnlijk is sinds u erom vroeg, maar hoe dan ook)

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

Antwoord 2, autoriteit 12%

Ik heb een mod_rewrite-oplossing gevonden die goed werkt voor zowel proxyservers als niet-proxyservers.

Als je CloudFlare, AWS Elastic Load Balancing, Heroku, OpenShiftof een andere Cloud/PaaS-oplossing gebruikt en je ervaart omleidingslussenmet normale HTTPS-omleidingen, probeer dan in plaats daarvan het volgende fragment.

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]

Antwoord 3, autoriteit 8%

PHP-oplossing

Rechtstreeks geleend van Gordons zeer uitgebreide antwoord, merk ik op dat in uw vraag wordt vermeld dat u paginaspecifiek bent bij het afdwingen van HTTPS/SSL-verbindingen.

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

Vervolgens, zo dicht mogelijk bij de bovenkant van deze pagina’s die u wilt forceren om verbinding te maken via PHP, kunt u require()een gecentraliseerd bestand met deze (en alle andere) aangepaste functies, en dan voer gewoon de functie forceHTTPS()uit.

HTACCESS / mod_rewrite-oplossing

Ik heb dit soort oplossingen niet persoonlijk geïmplementeerd (ik heb de neiging gehad om de PHP-oplossing te gebruiken, zoals die hierboven, vanwege de eenvoud), maar het volgende kan op zijn minst een goed begin zijn.

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]

Antwoord 4, autoriteit 2%

Mod-rewrite-gebaseerde oplossing:

Als u de volgende code in htaccess gebruikt, worden alle http-verzoeken automatisch doorgestuurd naar https.

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

Hierdoor worden uw niet-wwwen wwwhttp-verzoeken omgeleid naar de www-versie van https.

Een andere oplossing (Apache 2.4*)

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

Dit werkt niet op lagere versies van apache omdat de %{REQUEST_SCHEME} variabele is toegevoegd aan mod-rewrite sinds 2.4.


Antwoord 5, autoriteit 2%

Ik wil er alleen op wijzen dat Apache de slechtsteoverervingsregels heeft bij het gebruik van meerdere .htaccess-bestanden in verschillende directory-diepten. Twee belangrijke valkuilen:

  • Alleen de regels in het diepste .htaccess-bestand worden standaard uitgevoerd. U moet de instructie RewriteOptions InheritDownBefore(of iets dergelijks) opgeven om dit te wijzigen. (zie vraag)
  • Het patroon wordt toegepast op het bestandspad ten opzichte van de submap en niet op de bovenste map met het .htaccess-bestand met de gegeven regel. (zie discussie)

Dit betekent dat de voorgestelde globale oplossing op de Apache Wikinietwerken als u andere .htaccess-bestanden in submappen gebruikt. Ik heb een aangepaste versie geschreven die dat wel doet:

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/

Antwoord 6

Eenvoudig en eenvoudig, gewoon toevoegen Volgen

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

Antwoord 7

Deze code werkt voor mij

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP:X-HTTPS} !1
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

Antwoord 8

Eenvoudige:

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

Vervang uw URL met example.com


Antwoord 9

Probeer deze code, het werkt voor alle versie van URL’s zoals

Other episodes