25

Existe-t-il un moyen de configurer le serveur web Apache pour renvoyer un code d'erreur 404 (non trouvé) au lieu de 403 (interdit) pour certains répertoires spécifiques que je veux interdire d'accès?Existe-t-il un moyen de forcer apache à retourner 404 au lieu de 403?

J'ai trouvé quelques solutions suggérant l'utilisation de mod_rewrite, comme par ex.

RewriteEngine On 
RewriteRule ^.*$ /404 [L] 

Comme dans le but d'envoyer 404 au lieu de 403 est à obscurcir la structure de répertoire, cette solution est trop révélateur, car il redirige vers une autre emplacement qui le rend évident que le répertoire initialement accessible existe effectivement.

+0

Est-ce que [cette question] (http://stackoverflow.com/questions/548156/problem-redirecting-403-forbidden-to-404-not-found) résout votre problème? –

+0

Je n'ai pas considéré cette question quand je l'ai vu pour la première fois (trop confus), mais après un deuxième coup d'œil j'ai trouvé la ligne que je cherchais, merci. – fuenfundachtzig

Répondre

25

RedirectMatch comme dans p.

RedirectMatch 404 ".*\/\..*" 

le tour est joué, il interdit l'accès à tous les fichiers ou répertoires commençant par un point, ce qui donne une erreur « 404 Not Found ». D'après le manuel d'Apache: "La directive Redirect [Match] mappe une ancienne URL en une nouvelle en demandant au client de recréer la ressource au nouvel emplacement." Par défaut, Redirect envoie un code retour 302, mais il peut également renvoyer d'autres codes d'état comme indiqué ci-dessus.

+3

+1, mais pour faire correspondre un seul point n'importe où dans le chemin d'URL, avons-nous vraiment besoin des guillemets et de l'étoile? Par exemple, ne pouvons-nous pas faire 'RedirectMatch 404/\.' Au lieu de 'RedirectMatch 404". * \/\ .. * "'? – zx81

5

Vous pouvez faire quelque chose comme ceci:

.htaccess

ErrorDocument 403 /error/404.php

404.php

<?php 
$status = $_SERVER['REDIRECT_STATUS'] = 404; 
header($_SERVER['SERVER_PROTOCOL'] . ' ' . $status); 
?> 

404 Error 
+2

* Pourquoi cela n'est-il pas suffisant? * J'ai utilisé cette solution. C'est très simple. Cependant, comme j'ai PHP> = 5.4.0, j'ai simplement utilisé ' 'en haut de la page' 404.php'. De cette façon, je peux utiliser 'ErrorDocument *** n'importe quel code ***/error/404.php' et ils deviendront tous '404' dans l'en-tête HTTP. – ADTC

+0

Que se passe-t-il si je veux envoyer toutes les demandes à un script de contrôleur frontal index.php unique et que je décide si 404.php doit être exécuté? – tonix

+1

@ADTC, ce n'est pas pertinent à la question, qui était de savoir comment demander à Apache de le faire, pas PHP. –

-2

Pour modifier toutes les erreurs 403,400 en 404 erreurs, mettre cela à la fin de /etc/apache2/conf.d/localized-error-pages ou dans une .htaccess

# Will raise a 404 error, because the file <fake_file_for_apache_404.php> doesn't exist. 
# We change 403 or 400 to 404 ! 
ErrorDocument 400 /fake_file_for_apache_404.php 
ErrorDocument 403 /fake_file_for_apache_404.php 
# We need to rewrite 404 error, else we will have "fake_file_for_apache_404.php not found" 
ErrorDocument 404 "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\"><html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL <script type=\"text/javascript\">document.write(document.location.pathname);</script> was not found on this server.</p></body></html>" 
ErrorDocument 500 "Server in update. Please comme back later." 
+0

J'ai donné +1 30 minutes auparavant, et je sais que je réalise: HTML renvoie 404, mais le code d'état HTTP renvoie toujours "HTTP/1.1 403 Interdit" (Devrait être -1 à la place)! –

+0

Cela fonctionne. Voir ma modification à http://stackoverflow.com/questions/6479198/denying-via-404-instead-of-403/20642687#20642687 – ImmortalPC

6

Après avoir la même problème, je me suis retrouvé avec le fichier .htaccess suivant

Options -Indexes 
RewriteCond %{HTTP_HOST} ^(www\.)?mydomain.com [NC] 
RewriteRule ^(.*)/$ - [R=404,NC] 

la 1ère et 3ème ligne vous assurer que vous ne pouvez pas lister le contenu du dossier, et si vous le faites, vous recevrez une erreur 404. La directive RewriteCond garantit que cette règle de réécriture s'applique uniquement au domaine principal. Comme j'ai plusieurs sous-domaines, sans la réécriture, accéder à www.mydomain.com/subdomain renvoyait également un 404, ce qui n'était pas ce que j'avais prévu.

+0

Cela fonctionne bien pour moi. Un seul problème est la façon dont fonctionne 'Options -Indexes':/img/(qui n'existe pas) a renvoyé correctement un 404, mais/img/(qui existe et je veux accéder à, mais pas une liste de répertoires pour) retourné a 403. Donc, j'ai enlevé 'Options -Indexes 'et je me suis juste assuré que les regexes (qui spécifient les fichiers autorisés) ne correspondent jamais à un nom de répertoire. –

+0

* Ce n'est pas un sous-domaine, mais un sous-site ..., pourrait être contourné par RewriteCond pour la vérification du répertoire (... -d ...) ... –

Questions connexes