6

La parte pertinente de mi .htaccess se ve así:Problema a redirigir 403 Forbidden a 404 Not Found

Y está generando las siguientes respuestas:

  • /include 403
  • /include/404
  • /include/config.inc 403

Puedo ver mi patrón que el problema es probable en la parte (/.*) pero todo lo que he intentado me da los mismos resultados; en lugar de obtener 404 de forma consistente, obtengo un 404 para el primer caso y 403 para todo lo demás. ¿Qué pasa con la expresión que estoy usando? Alternativamente, dado que tengo que hacer esto para algunos directorios, ¿existe un enfoque general que me permita convertir las 403 respuestas a 404?

ACTUALIZACIÓN: He descubierto que mediante la eliminación de la FileMatch consigo mejores resultados, por lo que mi .htaccess ahora se ve así:

Options -Indexes 
RedirectMatch 404 ^/include(/.*)?$ # Added dlamblin's first suggestion 

y genera las siguientes respuestas:

  • /incluir 404
  • /include/404
  • /include/config.inc 403

UPDATE: Curiosamente he descubierto que la siguiente produce una salida diferente:

RedirectMatch 404 ^/include(/?|/.*)$ 
RedirectMatch 404 ^/template(/?|/.*)$ 

el patrón de plantilla funciona en todos los casos, sin embargo incluyen todavía está generando 403 para todos los archivos en incluir (por ejemplo, /include/config.inc) ¿Podría ser un problema con el nombre del directorio y no un problema con el archivo .htaccess en sí?

ACTUALIZACIÓN: El siguiente en mi .htaccess entraba en conflicto con la redirección cuando se accede a /include/config.inc.

<FilesMatch config> 
    Order allow,deny 
    Deny from all 
</FilesMatch> 
+2

Es hace mucho tiempo ahora, pero me gustaría sugerir que se podía resolver todos estos problemas, con solo colocar su incluye plantillas y en algún lugar fuera la raíz del documento; ¡es la forma más difícil de arruinar y tiene una carga ligeramente menor en Apache para arrancar! –

+0

más rápida y más sencilla solución que sólo necesita 'Directiva ErrorDocument' y una página PHP para el error 404: [. Sólo tiene que usar' http_response_code'] (http://stackoverflow.com/a/18109452/1134080) No hay necesidad de meterse con ' RedirectMatch', 'RewriteEngine', etc. – ADTC

Respuesta

5

Puedo entender por qué el/include no es capturado por su RedirectMatch, no está llegando al final '/'opcional, sin embargo, la parte /include/config.inc está un poco en el lado desconcertante.

Esto es lo que tengo que trabajar en Apache 2.2:

<FilesMatch /include(/?|/.*)> 
    Order allow,deny 
    Deny from all 
</FilesMatch> 

RedirectMatch 404 ^/include(/?|/.*)$ 

Este se encarga de estos casos:

/include 404 
/include/ 404 
/include/config.inc 404 

que tenía que cambiar la parte FilesMatch a fin de que los/incluyen parte para que funcione correctamente.

EDIT:

La línea de solape también funciona sin el > sección < FilesMatch en .htaccess y da los resultados esperados.

+0

Tiene que haber algo más que esté causando el problema porque usar este /include/config.inc aún genera un 403. Voy a hacer algo de búsqueda en mi httpd.conf y ver si algo interfiere. –

+0

¿Qué podría pasar con 'RewriteRule ^/include (/? | /.*)$ - [R = 404, NC, L]'? –

1

¿No quieres '^/include (/.*)?$'

Esta parte es una suposición, pero ¿qué pasaría si pones el RedirectMatch por encima del bloque. De esa forma no negaría (prohibiría) el acceso a una solicitud antes de redirigir esa solicitud al 404.

+0

Buen punto, lamentablemente obtengo los mismos resultados. –

4

Otra posibilidad es no molestar a juego todo el camino:

RedirectMatch 404 ^/include 

Si hay rutas de URL visibles públicamente que podría comenzar con "/ include" (por ejemplo, "/ includeMe"), una pequeña adición se separar lo privado de las direcciones URL públicas:

RedirectMatch 404 ^/include(/|$) 
0

Esta funciona como se espera para todos los archivos/directorios con nombre iniciadas por puntos, incluso en subdirectorios:

<FilesMatch "^\..+"> 
    Order allow,deny 
    Deny from all 
    Satisfy All 
</FilesMatch> 
RedirectMatch 404 \/\..+$ 
1

Una manera mejor y más sencilla es la siguiente:

1 - Insertar en conf principal (es decir VHOST mundo exterior):

<IfModule mod_alias.c> 
RedirectMatch 404 ^/myDirectory(?|\/)$ 
</IfModule> 

con mydirectory = CSS, JS, imágenes ...

2 - se puede establecer un nivel de directorio -Indexes de la siguiente manera:

Permita que su contenido directiva "DirectoryIndex" Apache para ser servido:

<Directory "/myPathtoMyWebDocRoot/"> 
    Options Indexes 
    AllowOverride None 
    Order Allow, Deny 
    Allow from all 
</Directory> 

y Denegar índice del directorio para los demás:

<Directory "/myPathtoMyWebDocRoot/myDirectory/"> 
    Options -Indexes 
    AllowOverride None 
    Order Allow, Deny 
    Allow from all 
</Directory> 

con mydirectory = *, css, imágenes, js, secreto, ... siguiendo sus necesidades.

2

Con mod reescribir:

RewriteEngine on 

RewriteCond %{THE_REQUEST} ^.*/\. 
RewriteRule ^(.*)$ - [R=404] 

Cada archivo o directorio que comienzan con un punto serán redirigidos a 404.

/myDir/.svn => 404 
/.gitignore => 404 
/dir1/dir2_dir3/ 

O para cambiar todos los errores en 403,400 404 errores, poner esto en el 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." 
0

En ese caso no necesita usar Options -Indexes Mi solución para dejar de mostrar el contenido del directorio como lista y mostrar el error 404 es simple. Cree el archivo .htaccess en el directorio raíz de su proyecto y escriba qué directorios deberían protegerse.

Directorios estructura

- your_root_directory 
    - .htaccess 
    - 404.html 
    - index.html 
    - app 
    - other files I do not want to show 
    - models 
    - other files I do not want to show 

.htaccess

RewriteEngine On 
RewriteRule ^app/ - [R=404,L] 
RewriteRule ^models/ - [R=404,L] 

ErrorDocument 404 /your_root_directory/404.html La segunda línea de .htaccess no permitir el acceso a una lista de elementos en el directorio de aplicaciones y todos sus subridectories.

La tercera línea de .htaccess no permitir el acceso a una lista de elementos en el directorio y todos sus modelos subridectories.

La cuarta línea de .htaccess establece nuestro propio error 404 (si no desea mostrar errores por defecto de Apache).

Recuerde que vaciar la caché de su navegador cuando se trabaja con .htaccess.

Cuestiones relacionadas