HTACCESS met SSL certificaat
Zelf heb ik de volgende Rule in mijn HTACCESSS staan:
Waarbij index.php belangrijk is voor de werking van de site. Hoe combineer ik het een en ander?
Bij voorbaat dank
Je wilt eerst altijd regel uitvoeren om alles naar je https:// protocol te sturen.
Wanneer een RewriteRule vooraf wordt gegaan door een RewriteCond houdt dat in dat alleen wanneer aan de conditie wordt voldaan de rule wordt uitgevoerd. De eerste stap in het doorlopen van je .htaccess-bestand zou dus inderdaad het overschakelen naar HTTPS moeten zijn, als je dit wilt forceren.
De [L] flag zorgt er normaal voor dat zodra er een RewriteRule (met of zonder condities) is uitgevoerd dat het herschrijf-proces stopt.
De [R] flag zorgt voor... een redirect :) - de pagina wordt opnieuw aangeroepen (met de nieuwe URL) en het .htaccess-bestand wordt weer vanaf het begin doorlopen. Na de redirect wordt de eerste rule niet meer uitgevoerd omdat niet wordt voldaan aan de conditie, je zit nu immers al op HTTPS. Vervolgens wordt de tweede rule direct uitgevoerd, omdat deze verder geen condities heeft.
Stomtoevallig was ik hier net iets over aan het uitzoeken, de snippet die ik hierbij voorbij zag komen zag er als volgt uit:
Code (php)
1
2
3
2
3
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Het enige verschil is in wezen de redirect-status (301 = definitief verplaatst). Dit is mogelijk beter dan de standaard status (302 = tijdelijk verplaatst) als het je plan is om alles permanent te verhuizen naar de HTTPS-variant.
Zie ook de > Apache RewriteRule Flags documentatie.
EDIT: het overstappen van HTTP naar HTTPS is ook een beetje een migratietraject, het is meer dan enkel een schakelaar omgooien, zoals het bovenstaande illustreert. Content heeft mogelijk "krediet" opgebouwd (bij zoekmachines), je moet er dan ook zorg voor dragen dat de transitie goed verloopt.
Gewijzigd op 14/04/2018 17:14:27 door Thomas van den Heuvel
Quote:
Het enige verschil is in wezen de redirect-status (301 = definitief verplaatst). Dit is mogelijk beter dan de standaard status (302 = tijdelijk verplaatst) als het je plan is om alles permanent te verhuizen naar de HTTPS-variant.
Ik word nooit zo enthousiast van 301-redirects. Heb daar slechte ervaringen mee, omdat veel browsers die redirects ook daadwerkelijk permanent cachen, en als het ooit eens nodig zou zijn om die redirect ongedaan te maken of te wijzigen, heb je een behoorlijke uitdaging om alle browsercaches leeg te maken van iedereen die ooit je site heeft bezocht. ;-)
Als je een site permanent op HTTPS wilt hebben, zou het mijn voorkeur hebben om op de HTTP-variant een 307-redirect te zetten (heeft mijn voorkeur boven een 302) en op je HTTPS-site een HSTS-header mee te geven:
Header always set Strict-Transport-Security "max-age=15768000;"
Met de notities van @Willem wordt het dus zoiets als:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
RewriteEngine On
# zoals aangegeven, eerst schakelen naar HTTPS
# gebruik eventueel (initieel) 307 i.p.v. 301
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# als we op HTTPS zitten business as usual
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]
# zoals aangegeven, eerst schakelen naar HTTPS
# gebruik eventueel (initieel) 307 i.p.v. 301
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# als we op HTTPS zitten business as usual
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]