Niet te veel redirects in een site? Hoe zit dit?

Status
Niet open voor verdere reacties.

Aar

Inventaris
Lid geworden
3 aug 2014
Berichten
10.106
Besturingssysteem
Windows 11 en diverse Linux-soorten
Office versie
Office 365
Ik had ergens gelezen dat je in je site niet te veel redirects moest hebben, omdat het ten koste zou gaan van search-spiders.

Nu heb ik een .htaccess met een paar redirects om te redirecten naar de www-site (site.nl -> www.site.nl), http naar https, en in mijn PHP-code een script die nieuws/42 doorstuurt (met een 301) naar een slug-URL zoals nieuws/42/dit-is-een-titel.html .

Bij elkaar dus drie redirects als je naar http://site.nl/nieuws/42 gaat.
Mijn .htaccess is als volgt:

Code:
<IfModule mod_rewrite.c>
# Alle non-www request doorsturen naar www
# RewriteCond %{HTTP_HOST} !^www\.
# RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

#Alles rewriten naar https met de huidige www-hostname.
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# Alles doorsturen naar de index, en daar alles afhandelen
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

Klopt het inderdaad dat je het aantal redirects moet beperken? En kan iemand een advies geven over hoe mijn .htaccess korter kan?
 
Je laatste vraag, ja, het lieft niet te veel redirects. Vooral bij een menu herinrichting ontkom je er niet aan :(

example.nl -> www.example.nl en http -> https
Deze 2 kan je combineren in 1 redirect. Het wordt dan
Code:
RewriteEngine on
Options -Indexes

### base is / (root-index in htdocs) or /dir (root-index in subdir)
RewriteBase /cms

### IF not https, OR
RewriteCond %{HTTPS} !=on [OR]
### IF not www.
RewriteCond %{HTTP_HOST} !^www\.
### THEN 301 redirect to whatever you want
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

### other redirects here

### IF request is not dir and not file then index.php?pg=...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ index.php?pg=$1 [QSA]

301 Redirect in PHP
Dit los ik op met een "interne redirect", niet met een externe 301. Je haalt intern in je php andere content uit de database. Je houdt dit bij in een internal_redirect_table. Minder redirects, stuk sneller, en makkelijker in onderhoud. Dit is uiteraard alleen zinvol als de urls van toepassing blijven op de content.

In het algemeen.
Kijk of het met een interne redirect kan (url naamgeving moet met content overeen blijven komen)
Als dat niet lukt, probeer groep-redirects, bijv. alles met /test/ naar /live/
Gaat dat ook niet probeer redirects dan te combineren, zoals code hierboven.
Lukt dit allemaal niet dan per pagina redirecten.

De <IfModule mod_rewrite.c>....</IfModule> mag je weglaten.
Als de provider dit niet heeft of als de module niet werkt dan werkt RewriteEngine niet en friendly-urls ook niet.
 
Laatst bewerkt:
Dankjewel, het werkt goed!

Echter de interne redirects in PHP werken met slugs die ik on-the-fly aan de hand van de titel ophaal, en aan de URL's hang. Deze zijn niet apart opgeslagen.
In ieder geval is er nu al één redirect minder in de .htaccess.

Maar is er een maximum aan redirects? En wat zijn de consequenties? Kan Google echt lastig doen? En kan de SEO-rank eventueel zakken? Of heeft dat geen invloed op het aantal requests?
 
Een slug 'on the fly' vraagt om goed beheer. voordeel: goede seo-vriendelijke urls, afgestemd op de content. nadeel: als de title verandert zal de slug veranderen en dan is de pagina niet meer vindbaar. Je kan ook een title (slug) én een interne redirect opslaan. Als er een interne redirect is dan vervangt deze de slug.

Een htaccess mag duizenden Redirects bevatten zolang er maar 1 of een paar worden uitgevoerd en er geen oneindige loop ontstaat. Probeer als het kan RewriteCond te gebruiken en slechts enkele RewriteRule's. Google ziet de RewriteCond niet en het aantal requests is dan minimaal. Iemand op Stack gaf aan dat hij zonder problemen 200.000 RewriteCond heeft met een klein aantal RewriteRule's.

Het Apache manual is vreselijk, een betere handleiding vind je op https://www.askapache.com/htaccess/

De htaccess kan je testen op https://htaccess.madewithlove.be/
Ik zie daarmee een foutje in mijn code :) Op de laatste regel moet %{HTTP_HOST} worden vervangen door www.example.nl
Code:
RewriteRule ^(.*)$ https://www.example.nl/{REQUEST_URI} [L,R=301]

Je vragen:
Is er een maximum aan redirects? Volgens mij niet, wel nadelen.
En wat zijn de consequenties? Zie hieronder.
Kan Google echt lastig doen? Ja, na 'een aantal' redirects achter elkaar zijn ze het zat.
En kan de SEO-rank eventueel zakken? Ja, de 301 redirects geven vertraging dus ranking zakt.
Of heeft dat geen invloed op het aantal requests? Bij elke redirect wordt opnieuw een request gedaan en elke regel in htaccess weer getest.

htaccess is niet de vertragende factor en ook niet de boosdoener voor google. Het zijn de 're-requests' (bijv. 301) die je in htaccess opgeeft en die google niet fijn vindt. De RewriteCond ziet google niet en daarmee kan je een htaccess een goede performance geven.

Als er veel redirects zijn wordt de kans
- op een tragere website groter.
- op een oneindige loop groter.
- op dubbel gevonden content (door google) groter.
- op een lagere ranking groter (bij teveel redirects achter elkaar).
- op verkeerde redirects groter (elke regel in htaccess kan ellende bevatten)
 
Laatst bewerkt:
Dankje, ik ga eens de rest op mijn gemak doorlezen. :)

Maar over de slugs: In mijn geval zitten die niet 'hard vast' aan mijn content. Als ik ik www.domein.nl/nieuws/1234/bla-die-bla.html heb, dan maakt het niet uit wat er in die slug staat.
Als deze anders is dan wat het moet zijn, krijg je altijd een redirect naar de juiste. Maar ik moet nog eens goed kijken of het zinvol is om dat misschien aan te passen naar een opgeslagen slug.
 
Gaat goed komen zo te lezen. Belangrijk voor SEO is dat je in de url de inhoud van de pagina kan terugvinden.
Een pagina over de LaserJet heeft bijvoorbeeld een url: example.nl/printers/hp-laserjet-4000/
 
Even een schopje.

Het valt mij wel op dat deze code alleen niet werkt als ik mijn site probeer te bereiken via mijn ip.
Ik krijg dan de melding dat er teveel omleidingen zijn?

Niet dat het heel veel uitmaakt, maar het is wel weer handig op mijn mobiele telefoon om de site uit te testen (ja, jouw gebouwde layout komt snel online, mijn CMS zit in de afrondende fase ;) )

Maar waar wordt die loop door veroorzaakt?
 
Meestal een loop (combinatie van php en htaccess regels).
Voorbeeld van een loop: als geen https, redirect dan naar http (en alles begint opnieuw).
Code:
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Na teveel redirects zegt de browser "ik stop". De webserver vindt het geen probleem.

Ik ben benieuwd naar de website :D
 
Aan de PHP-code van mijn CMS ligt het niet, want de oude .htaccess werkte prima met mijn IP-adres, de nieuwe die jij gaf geeft op mijn IP aan dat er teveel omleidingen zijn.
 
Ah, de loop gevonden.

Als je op IP naar de website gaat wordt altijd deze regel uitgevoerd
RewriteCond %{HTTP_HOST} !^www\.
omdat er geen www. in het IP-adres staat.

De redirect is dan naar https://%{HTTP_HOST}%{REQUEST_URI}
maar HTTP_HOST bevat het IP adres dus je redirect weer naar het IP adres, zonder 'www.'
Oftewel een eindeloze lus.

Als je in de laatste regel %{HTTP_HOST} verandert in een 'harde' domeinnaam
Code:
### IF not https, OR
RewriteCond %{HTTPS} !=on [OR]
### IF not www.
RewriteCond %{HTTP_HOST} !^www\.
### THEN 301 redirect to https://www.
RewriteRule ^(.*)$ https://www.example.nl%{REQUEST_URI} [L,R=301]
dan zou het moeten werken.

edit. bug gevonden, bericht aangepast
 
Laatst bewerkt:
Ik zal het aanpassen....

Maar kan je zulke dingen niet debuggen in Apache? Er moet toch (hopelijk?) een test-modus zijn die kan aangeven wat de .htaccess rules exact doen, en waar die vastlopen?
 
Hoe je htaccess in Apache kan debuggen weet ik niet. Tools ken ik ook niet. Voor mij is het try-and-error.
Als hulpje is er bijvoorbeeld https://htaccess.madewithlove.be maar dat is ook geen garantie.

Kan je iets met het volgende?
Code:
### page not found
ErrorDocument 404 https://www.example.nl/error404.html

### no directory index, no serverinfo
Options -Indexes
ServerSignature Off

### rewrite on
RewriteEngine on

### base (in root / or in direcory /subdir)
RewriteBase /

### redirect: all requests to 'https://www.'
RewriteCond %{HTTPS} !=on [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.example.nl%{REQUEST_URI} [L,R=301]

### security: deny access to wp-config file
<Files wp-config.php>
Order allow,deny
Deny from all
</Files>

### security: deny access to certain extensions
<FilesMatch "\.(bak|cgi|config|dist|htaccess|htpasswd|inc|ini|log|pl|py|sh|sql)">
Order allow,deny
Deny from all
</FilesMatch>

### security: ETag and SameOrigin
<IfModule mod_headers.c>
# disable ETags
Header unset ETag
FileEtag None
# same origin, for example no iframes on other sites
Header set X-Frame-Options "SAMEORIGIN"
</IfModule>

### security: check request_uri and query_string
# if query contains http: or https:
RewriteCond %{QUERY_STRING} (http\:|https\:) [NC,OR]
# or url contains [ or ] (allowed but unsafe)
RewriteCond %{REQUEST_URI}  (\[|\]) [OR]
RewriteCond %{QUERY_STRING} (\[|\]) [OR]
# or url contains 3C or 3E (<script> hack)
RewriteCond %{REQUEST_URI}  (%3C|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} (%3C|%3E) [NC,OR]
# or url contains proc/self/environ (lfi hack)
RewriteCond %{REQUEST_URI}  proc\/self\/environ [NC,OR]
RewriteCond %{QUERY_STRING} proc\/self\/environ [NC,OR]
# or any script is trying to set a php global via query
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [NC,OR]
# or any script is trying to modify _request via query
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2}) [NC,OR]
# or query contains double slash
RewriteCond %{QUERY_STRING} // [OR]
# or query contains asterisk
RewriteCond %{QUERY_STRING} \*
# then 403 forbidden request
RewriteRule ^(.*)$ - [F,L]

### wordpress: rewrite if not file or directory
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
 
Ik ben er nog even ingedoken. Maar lokaal werkt het prima via www.website.test.
Maar op mijn telefoon heb ik uiteraard geen DNS, dus www.website.test gaat niet werken.

Dus wat zou hiervoor een oplossing zijn? Ik zou toch graag mijn site lokaal ook op mijn telefoon willen bekijken via https://192.168.178.41
Of kan ik anders beter de boel op mijn online test-locatie uploaden?
 
Bij meerdere RewriteCond wordt eerst elke [OR] verwerkt, daarna pas de regels zonder [OR] (de AND regels).
De volgorde is dus belangrijk. Wil je dit eens testen?

Code:
RewriteCond %{HTTPS} !=on [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{REMOTE_ADDR} !^192\.168\.178\.
RewriteRule ^(.*)$ https://www.example.nl%{REQUEST_URI} [L,R=301]

Met deze regels zou het zo moeten werken (let op de haken)

Code:
if ( ( https != on OR host != www. ) AND ( remote-ip != 192.168.178. ) ) {
   301 naar https://www.example.nl%request_uri
}

Een lokale IP 192.168.178 krijgt geen redirect, Wel of geen https maakt dan niet uit.
 
Laatst bewerkt:
Of kan ik anders beter de boel op mijn online test-locatie uploaden?
Soms kopieer ik de html van een pagina en upload die (incl. mapje met afbeeldingen) naar mijn provider.
Je hebt dan geen functionaliteit maar wel een snelle indruk op smartphone en tablet.
 
Het is allemaal gelukt, en de gecombineerde redirects lijken op mijn testlocatie voor een snelheidsboost te zorgen.

De TTFB (Time-to-first-byte) lag behoorlijk hoog bij de code uit mijn startpost, en met jouw aangepast versie ligt dit een stuk lager. Iets onder de 50 miliseconden.
Hoe komt het dat meer redirects vertragend werken? Omdat er steeds een DNS-lookup moet worden gedaan?
 
Top dat de snelheid is verbeterd :thumb: bovendien is het nu seo vriendelijker (minder redirects, betere performance).

Hoe komt het dat meer redirects vertragend werken? Omdat er steeds een DNS-lookup moet worden gedaan?
Yep, elke keer een dns aanvraag, daar worden bezoekers én Google niet vrolijk van.
Veel redirect rules in htaccess is niet erg zolang er maar een minimaal aantal bij een request worden uitgevoerd.

Als je "dns-prefetch" nog niet in je code hebt dan is dit ook een aanrader.
Hier (klik) vind je er een aantal.

Noot: de genoemde Bootstrap dns-prefetch is van Bootstrap 2 en 3 (niet van 4)
 
Laatst bewerkt:
Je kan jquery ook van Cloudflare halen met
Code:
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>

dan zet je ergens vanaf de 7e regel ofzo in de <head>
Code:
<link rel="dns-prefetch" href="//fonts.googleapis.com">
<link rel="dns-prefetch" href="//cdnjs.cloudflare.com">
<link rel="dns-prefetch" href="//stackpath.bootstrapcdn.com">

Je kan niet heel veel dns-prefetch in een pagina gebruiken want dan kan een browser een foutmelding geven.

Graag hoor ik of dit nog wat verbetering geeft dan pas ik het toe in een website waarmee ik bezig ben.
 
Laatst bewerkt:
DNS-prefetch, ga ik ook even in verdiepen.
Nu zijn het nog CDN's, maar misschien het lijkt me nog sneller om deze zelf te hosten.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan