404 redirect

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Ozzie PHP

Ozzie PHP

09/04/2013 01:45:54
Quote Anchor link
Hallo mensen,

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?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
header('HTTP/1.1 404 Not Found');
header('Location: http://www.foobar.nl');
?>

Het gaat er mij met name om of die 404 header daar op z'n plaats is. Weet iemand dat?
 
PHP hulp

PHP hulp

30/01/2025 21:57:10
 
Ward van der Put
Moderator

Ward van der Put

09/04/2013 07:39:54
Quote Anchor link
Je kunt daarvoor beter een ErrorDocument instellen in .htaccess, bijvoorbeeld je zoeksysteem:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
ErrorDocument 404 http://www.example.com/zoeken/
 
- Ariën  -
Beheerder

- Ariën -

09/04/2013 08:42:48
Quote Anchor link
Ikzelf heb een idee dat het zou moeten werken. Je kan het uittesten op
http://web-sniffer.net/
 
Landleven Tips

Landleven Tips

09/04/2013 09:37:58
Quote Anchor link
Moet hiermee niet de pagina die niet bestaat juist wel bestaan? Want waar wil je dit precies gaan instellen? In het centraal document heeft namelijk niet veel nut, aangezien dan de pagina juist moet bestaan.

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 :)
 
Ward van der Put
Moderator

Ward van der Put

09/04/2013 10:03:29
Quote Anchor link
Het ErrorDocument dat de 404 afhandelt, moet natuurlijk wél bestaan. Ontbreekt dat namelijk, dan treedt opnieuw een 404 op en blijft de server hangen op een eindeloze lus.

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
 
Ozzie PHP

Ozzie PHP

09/04/2013 14:25:57
Quote Anchor link
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 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?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
header('HTTP/1.1 404 Not Found');
header('Location: http://www.mijnsite.nl/niet-gevonden');
?>
Gewijzigd op 09/04/2013 14:26:47 door Ozzie PHP
 
Ward van der Put
Moderator

Ward van der Put

09/04/2013 14:50:08
Quote Anchor link
Een 404 is een clientfout, dus moet je de client melden dat deze een fout heeft gemaakt en bepaalt de client vervolgens hoe er met de eigen fout wordt omgegaan. Aan daar heb je een probleem: niet elke client handelt een 404 hetzelfde af. Bijvoorbeeld Internet Explorer en Chrome letten op de grootte in bytes van de 404-pagina.

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.
 
Ozzie PHP

Ozzie PHP

09/04/2013 14:52:57
Quote Anchor link
Ward, dank voor je reactie. Daar hebben we het al eens eerder over gehad ;)

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?
 
Erwin H

Erwin H

09/04/2013 15:04:52
Quote Anchor link
Als ik deze link een beetje snel scan dan is het wel verstandig: 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.
 
Ward van der Put
Moderator

Ward van der Put

09/04/2013 15:05:47
Quote Anchor link
Elke response is per definitie bedoeld voor "een client". Aangezien een 404 ook kan optreden bij een niet-gevonden afbeelding of een niet-gevonden CSS-bestand, kan dat een reden zijn om daar toch je eigen routing op te zetten. Bovendien wil je waarschijnlijk niet altijd dezelfde 404-pagina tonen, alleen al vanwege foutmeldingen in andere talen.

Even getest: bij een Location-header krijg je automatisch Status: HTTP/1.1 302 Moved Temporarily cadeau en is de 404-header verdwenen.
 
Ozzie PHP

Ozzie PHP

09/04/2013 15:10:16
Quote Anchor link
@Erwin: oké, dan laat ik 'm staan.

@Ward: ik kan het zelf niet testen helaas, maar als jij dit doet:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
header('HTTP/1.1 404 Not Found');
header('Location: http://www.mijnsite.nl/niet-gevonden');
?>

... 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...
 
Ward van der Put
Moderator

Ward van der Put

09/04/2013 15:28:49
Quote Anchor link
Ozzie PHP op 09/04/2013 15:10:16:
@Ward: ik kan het zelf niet testen helaas, maar als jij dit doet:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
header('HTTP/1.1 404 Not Found');
header('Location: http://www.mijnsite.nl/niet-gevonden');
?>

... 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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
header('HTTP/1.1 404 Not Found');
header('Location: http://www.example.com/niet-gevonden', false);
?>


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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
header('Location: http://www.example.com/niet-gevonden');
header('HTTP/1.1 404 Not Found', false);
?>


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.
 
Ozzie PHP

Ozzie PHP

09/04/2013 15:32:54
Quote Anchor link
Hmmm, ik vind het raar... maar kan het niet zo zijn dat jij de 404 niet te zien krijgt omdat de pagina wordt geredirect? Gebruik je een programma om die headers te zien trouwens?

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.
 
Ward van der Put
Moderator

Ward van der Put

09/04/2013 15:46:42
Quote Anchor link
Ik gebruik daarvoor inderdaad een sniffer.

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


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
 
Ozzie PHP

Ozzie PHP

09/04/2013 16:54:28
Quote Anchor link
Hmmm, vaag... dus eigenlijk kan dit niet fatsoenlijk worden opgelost als ik het goed begrijp?

(welk sniffer gebruik je?)
 
Ward van der Put
Moderator

Ward van der Put

09/04/2013 17:37:49
 
Ozzie PHP

Ozzie PHP

09/04/2013 17:40:06
Quote Anchor link
Zijn dat soort sites te vertrouwen? En zijn er ook tooltjes voor dat jij weet?
 
Ward van der Put
Moderator

Ward van der Put

09/04/2013 17:44:53
Quote Anchor link
Je kunt er zelf eentje maken met PHP en cURL :)
 
Ozzie PHP

Ozzie PHP

09/04/2013 19:41:05
Quote Anchor link
Geen idee hoe dat moet... en beetje veel werk voor sporadisch gebruik ;)
Maar je weet dus geen tooltje maak ik daar uit op.
 
MayDay PHP

MayDay PHP

09/04/2013 21:42:01
Quote Anchor link
@Ozzie

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)
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
<?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>';

?>


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
 
Ozzie PHP

Ozzie PHP

09/04/2013 22:16:54
Quote Anchor link
Dankjewel, maar ik heb echt geen flauw idee wat je hier aan het doen bent :-/
 

Pagina: 1 2 volgende »



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.