404 redirect
Als een pagina wordt opgevraagd die niet bestaat en ik wil doorverwijzen naar een eigen 404 pagina. Doe ik het dan op de juiste manier als ik eerst een header 404 geef en daarna een location header?
Het gaat er mij met name om of die 404 header daar op z'n plaats is. Weet iemand dat?
Dit vraag ik juist omdat ik wel geïnteseerd ben in deze methode. Ik weet dat .htacces altijd beter is, maar om het gewoon eens uit te proberen :)
Het ErrorDocument hoeft echter niet per se domweg een clientfout te melden. Vandaar dat ik een ander voorbeeld gaf: je kunt bijvoorbeeld een zoeksysteem aan het werk zetten. Je zou dat bijvoorbeeld kunnen gebruiken om actief met PHP of MySQL te gaan zoeken naar URL's die lijken op de niet-gevonden URL. Treedt de 404 bijvoorbeeld op bij de niet-bestaande URL www.example.com/klanteservice zonder tussen-n, dan zou zo'n systeem de bestaande URL www.example.com/klantenservice/ kunnen aanbieden.
Gewijzigd op 09/04/2013 10:03:56 door Ward van der Put
www.mijnsite.nl/contact dan kijkt het framework of de route "contact" bestaat en het toont vervolgens de juiste pagina. Echter als een niet bestaande url wordt opgevraagd www.mijnsite.nl/ik-besta-niet dan wil ik dat er een redirect wordt uitgevoerd naar een "niet gevonden" pagina in mijn framework. Maar ik vraag me dus af of het dan klopt als ik daaraan voorafgaand een 404 header stuur. Kan/mag dit?
Ik ben dus een framework aan het maken en dat framework bevat routes. Ieder request (url) wordt in het framework gestopt. Het framework kijkt vervolgens of er een match is. Stel de url is Code (php)
Gewijzigd op 09/04/2013 14:26:47 door Ozzie PHP
Een belangrijkere vraag is of je 'niet gevonden'-pagina altijd moet worden getoond. Is het antwoord 'ja', dan kun je vanwege de gemankeerde clientafhandeling overwegen helemaal geen 404-header te gebruiken.
Ik zou zelf eerder kiezen voor een compromis: een ErrorDocument in .htaccess instellen op een applicatie die de routing van fouten kan afhandelen.
Ik wil geen error document gebruiken, maar gewoon vanuit het framework een "niet gevonden" pagina tonen. Maar mijn vraag is dus of ik dan die header moet meesturen.
Wat betekent zo'n header eigenlijk? Voor wie is die bedoeld? Voor de browser? Voor een zoekmachine?
En kan het wel dat ik eerst een 404 header geef en vervolgens toch nog een pagina toon?
http://www.mcanerin.com/en/articles/301-redirect-404-error.asp
Kort gezegd, als een search engine ooit eens langs een foute link naar je pagina komt dan zal die dankzij de 404 begrijpen dat de link niet klopt en het niet zien als een redirect. Voor de gebruiker is de redirect handig omdat die dan een mooie pagina krijgt te zien en niet zo'n lelijke 404 foutmelding van de browser.
Als ik deze link een beetje snel scan dan is het wel verstandig: Kort gezegd, als een search engine ooit eens langs een foute link naar je pagina komt dan zal die dankzij de 404 begrijpen dat de link niet klopt en het niet zien als een redirect. Voor de gebruiker is de redirect handig omdat die dan een mooie pagina krijgt te zien en niet zo'n lelijke 404 foutmelding van de browser.
Even getest: bij een Location-header krijg je automatisch Status: HTTP/1.1 302 Moved Temporarily cadeau en is de 404-header verdwenen.
@Ward: ik kan het zelf niet testen helaas, maar als jij dit doet:
Code (php)
... dan krijg je geen 404 header??? Hoe kan dat nou weer... dat lijkt toch niet te kloppen. Of misschien zie jij die 404 niet omdat er geredirect wordt, maar hij zal er toch wel zijn lijk me...
Ozzie PHP op 09/04/2013 15:10:16:
@Ward: ik kan het zelf niet testen helaas, maar als jij dit doet:
... dan krijg je geen 404 header??? Hoe kan dat nou weer... dat lijkt toch niet te kloppen. Of misschien zie jij die 404 niet omdat er geredirect wordt, maar hij zal er toch wel zijn lijk me...
Code (php)
... dan krijg je geen 404 header??? Hoe kan dat nou weer... dat lijkt toch niet te kloppen. Of misschien zie jij die 404 niet omdat er geredirect wordt, maar hij zal er toch wel zijn lijk me...
Correct: de 404 is dan inderdaad verdwenen. Dat gebeurt zelfs als ik de parameter $replace op false zet:
Code (php)
Keer ik de headers om, dan krijg ik uitsluitend Status: HTTP/1.1 404 Not Found zonder de Location-header en zonder de 302-header:
Code (php)
Ergens is het wel logisch als je vanuit één HTTP-response redeneert, want je hebt hetzij redirection (vanaf 300), hetzij een clientfout (vanaf 400), maar niet beide tegelijk.
Maar hoe moet je zoiets dan oplossen? Want je wil een zoekmachine laten weten dat het een 404 is, maar je wil ook een mooie pagina voorschotelen.
Meteen maar even de omgekeerde test uitgevoerd. Mijn ErrorDocument 404 in .htaccess geeft een Status: HTTP/1.1 302 Found met vervolgens in Location: de URL van de 404-pagina. Ook géén 404-header dus.
Wel doet Apache gratis content cadeau:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="http://www.example.com/bestaat-niet">here</a>.</p>
</body></html>
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="http://www.example.com/bestaat-niet">here</a>.</p>
</body></html>
En dat is vervolgens niet de 404-pagina uit .htaccess die de meeste bezoekers zien.
Gewijzigd op 09/04/2013 15:47:09 door Ward van der Put
(welk sniffer gebruik je?)
Zijn dat soort sites te vertrouwen? En zijn er ook tooltjes voor dat jij weet?
Je kunt er zelf eentje maken met PHP en cURL :)
Maar je weet dus geen tooltje maak ik daar uit op.
Even iets kleins opgeschreven en getest. Het is niet erg heel mooi, maar doet precies wat je wilt en ik krijg dus wel een 404 redirect op mijn site. Maar ik voer geen redirect uit.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
# Url:
$ch = curl_init('http://domain/invalid-url');
# Geen output tonen op de site:
curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
# Volg de redirect 1 maal:
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 1);
# Exec uitvoeren:
curl_exec($ch);
# Toon het resultaat:
echo '<pre> ' . print_r(curl_getinfo($ch), true) . '</pre>';
?>
# Url:
$ch = curl_init('http://domain/invalid-url');
# Geen output tonen op de site:
curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
# Volg de redirect 1 maal:
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 1);
# Exec uitvoeren:
curl_exec($ch);
# Toon het resultaat:
echo '<pre> ' . print_r(curl_getinfo($ch), true) . '</pre>';
?>
Aangepast zodat de Location header gevolgd wordt en zodanig dat je daar de output van krijg. In eerste instantie kreeg ik dus een 404 HTTP code, maar wanneer ik de redirect volgde kreeg ik een 301 HTTP code.
Kijk ook naar redirect count en start bij 0 (CURLOPT_MAXREDIRS) en per redirect voeg je dan een toe en dan krijg je voor elke redirect de HTTP code of pas gewoon de code aan :-).
Mijn resultaten.
1. Zonder redirect: HTTP 404 Not Found
2. Met redirect op dezelfde server: HTTP 301 Redirect
3. Met redirect op localhost: HTTP 302 Moved
Gewijzigd op 09/04/2013 22:06:13 door MayDay PHP
Dankjewel, maar ik heb echt geen flauw idee wat je hier aan het doen bent :-/