2010-10-01 9 views
1

J'ai dans mon htaccess:Pourquoi errorDocument 404 n'attrape-t-il pas lorsqu'un répertoire n'existe pas, mais est créé par RewriteRule?

Options +FollowSymLinks 
Options -Indexes 
RewriteEngine On 
RewriteRule ^annons/([a-zA-Z0-9_]+)$ ad.php?ad_id=$1 [NC] 
ErrorDocument 404 /404.html 

Tout cela fonctionne, sauf un problème.

Quand j'écris une adresse qui n'existe pas, comme ceci:

http://www.domain.com/some_adress_that_doesnt_exist 

alors le 404.html est affiché.

MAIS, si je l'écris comme ceci:

http://www.domain.com/annons/some_adress_that_doesnt_exist 

(Notez les /annons/ n'existe pas réellement, il est "créé" dans les règles de réécriture.)

C'est seulement quand j'écris le /annons/ et puis une URL qui n'existe pas que le 404 ne fonctionne pas. Il fonctionne avec tous les autres sous-répertoires et combinaisons, mais je suppose que ma réécriture a quelques défauts ...

En ne fonctionnant pas, je veux dire une page blanche vierge apparaît sans information, comme si la page existait mais était complètement blanc.

Répondre

0

C'est seulement quand j'écris le/annons/et puis une URL qui n'existe pas que le 404 ne fonctionne pas.

Comment le serveur est-il censé savoir quels /annons/ existent et lesquels ne le sont pas? Vous êtes toujours en train de rediriger vers ad.php qui existe . Le No 404 arrive ici en ce qui concerne le serveur.

Le cas d'une annonce inexistante est quelque chose que vous devrez traiter dans votre script, par ex. en lançant un en-tête HTTP/1.0 404 Not Found et en affichant une page d'erreur. (Ou, mieux, utiliser la variable SERVER_PROTOCOL comme @Gumbo démontre)

+0

Juste pour que vous le savez, la page qui montre (page blanche) n'a pas de source, il semble ... Lorsque je clique sur « voir la source » est vide. .. Puis-je être sûr que c'est en fait la page ad.php? –

+0

@Camran probablement. Vous devrez sortir quelque chose sur la page ad.php pour le savoir à coup sûr. –

1

Eh bien, puisque ces URL sont se réécrits pour un fichier existant réellement (à savoir de ad.php), a été trouvé le fichier demandé.

Maintenant, si votre ad.php le script décide que la ressource demandée n'existe pas, vous devez gérer cela avec PHP en répondant avec un code d'état 404, par exemple:

header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found'); 

Après cela, vous alors pourrait renvoyer le document d'erreur pour obtenir le même résultat:

readfile('404.html'); 
+0

Est-ce que je fais cela dans une instruction if? Par exemple, si (! Isset ($ _ GET [id]))? –

+0

@Camran vous devez avoir une logique dans votre script publicitaire qui charge l'annonce spécifiée, et échoue si elle n'en trouve aucune. C'est l'endroit pour réagir, n'est-ce pas? –

+0

@Camran: Vous avez probablement une sorte de base de données où tous les ID valides sont. À un certain point il y a probablement un test si un tel ID existe; et si cela échoue, votre script * ad.php * ne fait probablement rien. – Gumbo