Goedenavond collegae,

Ik heb een .htaccess met de volgende rules:


#forceer https:
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.mijnwebsite.nl/$1 [R,L]

##Catch url structure for normal pages
# check that the request url is neither a file nor a directory
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/(.*)/(.*)/(.*)/(.*)/?$ /index.php?page=$1&var1=$2&var2=$3&var3=$4&var4=$5 [NC,L]

# check that the request url is neither a file nor a directory
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/(.*)/(.*)/(.*)/?$ /index.php?page=$1&var1=$2&var2=$3&var3=$4 [NC,L]

# check that the request url is neither a file nor a directory
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/(.*)/(.*)/?$ /index.php?page=$1&var1=$2&var2=$3 [NC,L]

# check that the request url is neither a file nor a directory
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/(.*)/?$ /index.php?page=$1&var1=$2 [NC,L]

# check that the request url is neither a file nor a directory
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/?$ /index.php?page=$1 [NC,L]


Zoals je ziet is er eerst een redirect om https te forceren, en vervolgens een aantal redirects op SEO-vriendelijke urls om te zetten voor afhandeling in mijn php-scripts.

Probleem ontstaat wanneer er een http:// request wordt gedaan, want dan krijg ik een probleem: "too many redirects".
Dat begrijp ik, want eerst een redirect om er https van te maken, en vervolgens nóg een redirect om de url verder te verwerken. Nu zoek ik al een tijdje naar een oplossing voor dit probleem maar kan het niet vinden.
Ik vermoed dat ik rules zal moeten combineren, maar hoe..?

Kan iemand mij helpen?

Paul
ik zou beginnen met de check "is het geen bestaande file EN geen bestaande map" om te draaien.
naar

ALS het een bestaande file/map is
DAN doe niets


RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]


Dat zet je bovenaan (na de https redirect) en dat scheelt je een berg code.

Tweede stap doe ik zo:

ALLES redirecten naar index.php

in index.php zoek ik dan wel uit via $_SERVER welke "mappen" er in de url stonden.
Dat is veel flexibeler. (ondanks dat jouw versie nog redelijk overzichtelijks, omdat je alleen maar var1, var2 etc gebruikt en niet voor "als de 2e term Edit is, dan ..."
Goedemorgen Ivo,
Dank je wel voor jouw feedback. Ik begrijp wat je bedoelt.
Wat ik niet zie is hoe met jouw oplossing het probleem van de multiple redirects wordt opgelost. Immers, wanneer de site wordt aangeroepen zonder https:// dan volgen er toch nog steeds 2 redirects..?

Groet, Paul
2 is niet too many.

Bovendien: alleen jouw https rule redirect (zie de [R] )

de andere rules verwijzen de server door naar een zeker script, maar geven geen "ga daarheen" commando terug naar de browser.

[size=xsmall]Toevoeging op 30/01/2017 10:27:43:[/size]

wat wel kan gebeuren: soms redirect je php script weer terug naar http://

Daarna komt .htaccess in actie om wederom naar https te gaan.

Is dat het geval? (check ook je rules mbt wel of geen www. in de url)
Correct. Alleen als de scripts zelf daarna nog 14 keer gaan redirecten zou je op too many uitkomen, immers 15 wordt in de meeste browsers beschouwd als de limiet.
Top! Bedankt voor de hulp. Ik ga ermee aan de slag en meld me nog even met het resultaat.
Niet heel erg gebruikelijk, maar HTTPS zou je ook op poort 80 kunnen forceren volgens mij? Kun je in plaats van een poort niet beter controleren of je in "HTTPS modus" zit, en op grond daarvan (indien dit niet het geval is) redirecten naar de https-variant?

Ik denk dat het eerste rewriterule/rewritecond blok de boosdoener is. En zoniet, dan nog is de controle nogal vreemd :]. Het doet zowel een aanname over op welke poort de (https) site (al dan niet) actief is. Misschien kun je het dan ook beter omdraaien, als je weet dat https actief is op poort X en de huidige poort NIET X is, dat je dan redirect naar https? Maar het combineren van deze twee is nog steeds raar dus wellicht is de controle op "HTTPS modus" beter.

Een interessante vraag is dus sowieso: op welke poorten zijn de (http en https) sites actief?
default draait http op poort 80 en https op 443.

Maar je bent vrij om daar varianten op te bedenken. Bijvoorbeeld om een test-server te kunnen draaien. Dan zou http op poort 81 kunnen zitten. Of op 8080.

Idem voor https natuurlijk.

$_SERVER['HTTPS'] heeft bij mij wel eens het probleem geleverd, dat per server die wel of niet bestond, of niet overal dezelfde inhoud had.

[size=xsmall]Toevoeging op 30/01/2017 21:20:23:[/size]

Je kunt trouwens in Firefox middels Firebug meestal de redirects meelezen. Dat zou een aanwijzing kunnen opleveren.
Nou, het is me nog steeds niet gelukt helaas.
Met de gegeven tips heb ik mijn .htaccess verbouwd tot dit:


Options -Indexes

php_value upload_max_filesize 10M
php_value post_max_size 10M
php_value max_input_time 120

#AddHandler x-httpd-php5 .php
#General settings
php_flag register_globals off
php_flag display_errors on

RewriteEngine On
RewriteBase /

#forceer https:
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

RewriteRule (.*) index.php?pageString=$1 [L,QSA,NC]


Echter, na aanroepen van een http:// request nog steeds de foutmelding in Chrome: ERR_TOO_MANY_REDIRECTS (en in FireFox een vergelijkbare melding).
Ziet iemand iets dat niet klopt in mijn code?

Groet, Paul
Als het niet in je .htaccess zit zit het in je PHP code. Kijk eens met de inspector in de network tab wat er precies aan redirects gedaan wordt.

Je mist overigens een R bij je https forcering.
RewriteCond %{HTTPS} off

ik zou dat omdraaien: wat moet het zijn als het WEL https is? dat is waarschijnlijk on of ON of On

Check dat even in $_SERVER.

Als je een http-verbinding hebt, kan het zijn dat $_SERVER['HTTPS'] of %{HTTPS} in zijn geheel ontbreekt.

>> RewriteCond %{HTTPS} ! ON


Verder zou je de redirect op regel 17 eens naar een heel andere site kunnen laten verwijzen. Bijvoorbeeld nu.nl.
Dan weet je in elk geval dat die redirect werkt.

(dat kun je ook met firebug zien, maar dat lukt je kennelijk nog niet)

Reageren