25

Esiste un modo per configurare il server Web Apache per restituire un codice di errore 404 (non trovato) anziché 403 (vietato) per alcune directory specifiche a cui non si desidera accedere?C'è un modo per forzare l'apache a restituire 404 anziché 403?

Ho trovato alcune soluzioni che suggeriscono l'uso di mod_rewrite, come ad es.

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

Come fini di invio di 404 invece di 403 è quella di offuscare la struttura di directory, questa soluzione è troppo rivelatrice, perché reindirizza a una certa posizione diversa che rende evidente che la directory di origine si accede in realtà esiste.

+0

[questa domanda] (http://stackoverflow.com/questions/548156/problem-redirecting-403-forbidden-to-404-non-found) risolve il problema? –

+0

Non ho considerato questa domanda quando l'ho vista per la prima volta (troppo confusa), ma dopo una seconda occhiata ho trovato la linea che stavo cercando, grazie. – fuenfundachtzig

risposta

25

RedirectMatch come ad es.

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

fa il trucco, si vieta l'accesso a tutti i file o le directory che iniziano con un punto, dando un "404 Not Found" errore.

Dal manuale di Apache: "La direttiva Redirect [Match] mappa un vecchio URL in uno nuovo chiedendo al client di recuperare la risorsa nella nuova posizione." Per impostazione predefinita, Redirect invia un codice di ritorno 302, ma può anche restituire altri codici di stato come mostrato sopra.

+3

+1, ma per abbinare un singolo punto in qualsiasi punto del percorso dell'URL, abbiamo davvero bisogno delle virgolette e della stella-punto? Ad esempio, non possiamo semplicemente "RedirectMatch 404/\." Invece di "RedirectMatch 404". * \/\ .. * "'? – zx81

5

Si può fare qualcosa di simile:

.htaccess

ErrorDocument 403 /error/404.php

404.php

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

404 Error 
+2

* Perché questo valore non è sufficientemente ottimizzato? * Ho usato questa soluzione. È molto semplice. Tuttavia, poiché ho PHP> = 5.4.0, ho semplicemente usato ' 'nella parte superiore della pagina' 404.php'. In questo modo posso usare 'ErrorDocument *** qualsiasi codice ***/error/404.php' e diventeranno tutti '404' nell'intestazione HTTP. – ADTC

+0

E se volessi inviare tutte le richieste a uno script del front controller univoco index.php e decidere se è necessario eseguire 404.php? – tonix

+1

@ADTC, non è rilevante per la domanda, che era come chiedere ad Apache di farlo, non in PHP. –

-2

Per modificare tutti 403,400 errori in errori 404, mettere questo alla fine /etc/apache2/conf.d/localized-error-pages O in un .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

Ho dato +1 30 minuti fa e so che realizzo: HTML restituisce 404, ma il codice di stato HTTP restituisce ancora "HTTP/1.1 403 Proibito" (dovrebbe essere -1 invece)! –

+0

Funziona. Vedere la mia modifica su http://stackoverflow.com/questions/6479198/denying-via-404-instead-of-403/20642687#20642687 – ImmortalPC

6

Dopo avere lo stesso problema, ho finito con il seguente file .htaccess

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

il 1 ° e 3 ° linea di assicurarsi che non si può elencare il contenuto della cartella, e se lo si fa si riceverà un errore 404. La direttiva RewriteCond garantisce che questa regola di riscrittura si applichi solo al dominio principale. Poiché ho diversi sottodomini, senza la riscrittura, l'accesso a www.mydomain.com/subdomain restituiva anche un 404, che non era quello che intendevo.

+0

Questo funziona bene per me. Un solo problema è il modo in cui 'Options -Indexes' funziona:/img/(che non esiste) ha restituito correttamente un 404, ma/img/(che esiste e voglio accedere a, ma non un elenco di directory per) restituito a 403. Quindi, quello che ho fatto è stato rimuovere 'Options -Indexes 'e assicurarmi che le regex (che specificano i file consentiti) non corrispondano mai solo al nome di una directory. –

+0

* Questo non è un sottodominio, ma un sito secondario ..., potrebbe essere ignorato da RewriteCond per il controllo della directory (... -d ...) ... –

Problemi correlati