.htaccess rewrites leiden tot 'too many redirects'

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Paul van Eck

Paul van Eck

28/01/2017 20:02:29
Quote Anchor link
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
 
PHP hulp

PHP hulp

26/12/2024 07:48:25
 
Ivo P

Ivo P

29/01/2017 15:04:38
Quote Anchor link
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

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
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 ..."
 
Paul van Eck

Paul van Eck

30/01/2017 07:25:36
Quote Anchor link
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
 
Ivo P

Ivo P

30/01/2017 10:24:55
Quote Anchor link
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.

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)
 
Ben van Velzen

Ben van Velzen

30/01/2017 10:27:52
Quote Anchor link
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.
 
Paul van Eck

Paul van Eck

30/01/2017 11:48:27
Quote Anchor link
Top! Bedankt voor de hulp. Ik ga ermee aan de slag en meld me nog even met het resultaat.
 
Thomas van den Heuvel

Thomas van den Heuvel

30/01/2017 18:07:52
Quote Anchor link
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?
Gewijzigd op 30/01/2017 18:09:07 door Thomas van den Heuvel
 
Ivo P

Ivo P

30/01/2017 21:18:14
Quote Anchor link
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.

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.
 
Paul van Eck

Paul van Eck

31/01/2017 08:55:33
Quote Anchor link
Nou, het is me nog steeds niet gelukt helaas.
Met de gegeven tips heb ik mijn .htaccess verbouwd tot dit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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]


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
 
Ben van Velzen

Ben van Velzen

31/01/2017 10:47:00
Quote Anchor link
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.
 
Ivo P

Ivo P

31/01/2017 11:28:00
Quote Anchor link
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)
 
Thomas van den Heuvel

Thomas van den Heuvel

31/01/2017 11:42:29
Quote Anchor link
Het introduceren van de querystring-parameter pageString is overigens niet nodig want index.php kan prima $_SERVER['REQUEST_URI'] uitlezen.
 
Paul van Eck

Paul van Eck

31/01/2017 11:58:28
Quote Anchor link
Heren,

De oplossing is gevonden. Mijn hostingprovider (PCextreme) geeft aan dat de volgende rules werken:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
RewriteCond %{HTTP:X-Forwarded-Proto} !http
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
 
Ben van Velzen

Ben van Velzen

31/01/2017 12:42:47
Quote Anchor link
Zo te zien heb je een frontend voor de server zitten, mogelijk een loadbalancer. Dan werken dit soort regels inderdaad.
 
Ivo P

Ivo P

31/01/2017 12:54:08
Quote Anchor link
kijkend in mijn servers $_SERVER-vars:

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)
 
Paul Biegel

Paul Biegel

12/02/2017 17:21:21
Quote Anchor link
Ik heb een probleem met de redirect van http naar https voor alle (sub)pagina's. In het .htaccess bestand in de root van de wordpress folder staat het volgende:

## 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?
 
Ivo P

Ivo P

12/02/2017 17:29:36
Quote Anchor link
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

aanpassen naar

RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [L,R=301]

Of eventueel

RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301]
 
Ozzie PHP

Ozzie PHP

12/02/2017 17:38:47
Quote Anchor link
@Paul Biegel

Graag de volgende keer zelf een nieuw topic aanmaken en niet andermans topic 'kapen'.
 
Paul Biegel

Paul Biegel

12/02/2017 17:59:02
Quote Anchor link
Bedankt voor de snelle reactie Ivo P. In het vervolg zal ik idd een nieuw topic aanmaken. excuus.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.