security - puente - instalacion apache
¿Hay alguna manera de forzar a Apache a devolver 404 en lugar de 403? (4)
¿Hay alguna manera de cómo puedo configurar el servidor web Apache para que devuelva un código de error 404 (no encontrado) en lugar de 403 (prohibido) para algunos directorios específicos a los que no quiero permitir el acceso?
Encontré algunas soluciones que sugieren el uso de mod_rewrite, como por ejemplo
RewriteEngine On
RewriteRule ^.*$ /404 [L]
Como el objetivo de enviar 404 en lugar de 403 es ofuscar la estructura del directorio, esta solución es demasiado reveladora, ya que redirige a una ubicación diferente, lo que hace obvio que el directorio al que se accedió realmente existe.
Después de tener el mismo problema, terminé con el siguiente archivo .htaccess
Options -Indexes
RewriteCond %{HTTP_HOST} ^(www/.)?mydomain.com [NC]
RewriteRule ^(.*)/$ - [R=404,NC]
La 1ra y la 3ra línea aseguran que no puede listar el contenido de la carpeta y, si lo hace, recibirá un error 404. La directiva RewriteCond garantiza que esta regla de reescritura solo se aplica al dominio principal. Como tengo varios subdominios, sin el rewritecond, acceder a www.mydomain.com/subdomain también devolvía un 404, que no era lo que pretendía.
Para cambiar los 403,400 errores en errores 404, ponga esto al final de /etc/apache2/conf.d/localized-error-pages O en 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."
Puedes hacer algo como esto:
.htaccess
ErrorDocument 403 /error/404.php
404.php
<?php
$status = $_SERVER[''REDIRECT_STATUS''] = 404;
header( $_SERVER[''SERVER_PROTOCOL''] . '' '' . $status);
?>
404 Error
RedirectMatch como en por ejemplo
RedirectMatch 404 ".*///..*"
El truco, prohibe el acceso a todos los archivos o directorios comenzando con un punto, dando un error "404 no encontrado".
Del manual de Apache: "La directiva Redirect [Match] mapea una antigua URL en una nueva pidiéndole al cliente que vuelva a buscar el recurso en la nueva ubicación". Por defecto, Redirect envía un código de retorno 302, pero también puede devolver otros códigos de estado como se muestra arriba.