Ik heb gisteren een SSL certificaat voor een bepaald domein aangeschaft. Om het een en ander werkend te maken dien ik volgens de beschrijving de volgende regels (Cond & Rule) aan mijn HTACCESS toe te voegen:

RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]


Zelf heb ik de volgende Rule in mijn HTACCESSS staan:

RewriteRule ^ index.php [QSA,L]

Waarbij index.php belangrijk is voor de werking van de site. Hoe combineer ik het een en ander?

Bij voorbaat dank
Gewoon beiden erna, zoals je nu hebt!
Je wilt eerst altijd regel uitvoeren om alles naar je https:// protocol te sturen.
Wat @Ariën zegt. Het .htaccess bestand wordt van boven naar beneden doorgelezen en verwerkt.

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:
RewriteEngine On
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.
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;"
Hi @Ariën, @Thomas van den Heuvel en @Willem vp. Sorry voor de wat late reactie. Ik was een paar dagen afwezig. Bedankt allle drie voor de reactie. @@Thomas van den Heuvel Ik heb nog een vraagje hierover. In de openings post noemde ik alleen de RewriteRule die ik momenteel gebruik maar daar is ook de volgende RewriteCond aan gekoppeld. Dit is de complete HTACCESS zoals ie was

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]

De volgorde is meestal zoiets als:
<zet engine aan>
<conditie>
<rule>

<conditie>
<rule>

<rule>
<etc>


Met de notities van @Willem wordt het dus zoiets als:
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]

Reageren