.htaccess rewrites leiden tot 'too many redirects'
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
naar
ALS het een bestaande file/map is
DAN doe niets
Code (php)
1
2
3
2
3
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
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 ..."
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
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.
Toevoeging op 30/01/2017 10:27:43:
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.
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?
Gewijzigd op 30/01/2017 18:09:07 door Thomas van den Heuvel
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.
Toevoeging op 30/01/2017 21:20:23:
Je kunt trouwens in Firefox middels Firebug meestal de redirects meelezen. Dat zou een aanwijzing kunnen opleveren.
Met de gegeven tips heb ik mijn .htaccess verbouwd tot dit:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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]
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
Je mist overigens een R bij je https forcering.
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)
Het introduceren van de querystring-parameter pageString is overigens niet nodig want index.php kan prima $_SERVER['REQUEST_URI'] uitlezen.
De oplossing is gevonden. Mijn hostingprovider (PCextreme) geeft aan dat de volgende rules werken:
Code (php)
1
2
2
RewriteCond %{HTTP:X-Forwarded-Proto} !http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
En waarempel.. het werkt.
Ik ben wel verbaasd dat er zoveel verschil blijkt te zijn op de code die gebruikt kan worden, aangezien het toch vrijwel altijd een Unix server is.. Maar goed, ik ben absoluut geen kenner van webservers. Bedankt allemaal voor de feedback en het meedenken!
Groet, Paul
Zo te zien heb je een frontend voor de server zitten, mogelijk een loadbalancer. Dan werken dit soort regels inderdaad.
in geval van https bestaat er $_SERVER['HTTPS'] met de value ON
in geval van http bestaat deze niet.
Verder bestaat er een $_SERVER['REQUEST_SCHEME'] die http of https bevat.
Maar het is waarschijnlijk afhankelijk van de manier van compileren van Apache (of andere webserver)
## REDIRECT HTTPS ##
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
## REDIRECT HTTPS ##
Dit leidt echter tot een doorverwijzing naar https://mijnwebsite.nl/mijnwebsite.nl. Enig idee hoe dit op te lossen is?
aanpassen naar
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [L,R=301]
Of eventueel
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301]
Graag de volgende keer zelf een nieuw topic aanmaken en niet andermans topic 'kapen'.
Bedankt voor de snelle reactie Ivo P. In het vervolg zal ik idd een nieuw topic aanmaken. excuus.