redirectmatch examples example conf regex apache mod-rewrite http-status-code-403

regex - examples - redirect url apache



¿Cómo hacer que Apache prohíba un archivo solo si existe? (2)

He estado trabajando en este problema durante un par de horas, no, aún sin resolución. En caso de que no entiendas lo que estoy preguntando por el título, lo elaboraré. Estoy tratando de prohibir el acceso a ciertas hojas de estilo y scripts de Apache, pero solo quiero arrojar el error 403 si el archivo no existe.

Aquí hay algunos ejemplos de lo que he intentado:

RewriteCond %{REQUEST_FILENAME} -d RewriteCond %{REQUEST_FILENAME} -f RewriteRule (admin|staff)-?[a-zA-Z1-9]*/.(css|js|php)(.map)?$ - [F,L,NC]

Esto no funcionó por alguna extraña razón, no tengo idea de por qué.

Además, antes de continuar con más ejemplos, explicaré lo que estoy tratando de lograr con la expresión regular: estoy usando control de versiones, por lo que nunca puedo estar seguro de lo que viene después de la administración y el personal, entonces estoy usando una clase de personaje opcional. Solo afecta a las extensiones css , js y php , así como a css.map extensiones css.map . Por cierto, si te preguntas por qué hay una raya entre la clase de caracteres y la parte admin | staff de la expresión regular, es porque mi herramienta de control de versiones separa la fecha y el nombre del archivo con un guion. En caso de que esta información lo ayude, la herramienta de control de versiones que estoy usando es Laravel Elixir.

Más ejemplos:

RewriteCond %{REQUEST_FILENAME} -d RewriteCond %{REQUEST_FILENAME} -f RewriteRedirect 403 (admin|staff)-?[a-zA-Z1-9]*/.(css|js|php)(.map)?$ RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRedirect 404 (admin|staff)-?[a-zA-Z1-9]*/.(css|js|php)(.map)?$

En este ejemplo cualquiera que sea que coloque primero, llame a ese código de error.

Incluso he intentado usar la directiva, pero parece que se ha invocado incluso si el archivo no existe.

<FilesMatch "(admin|staff)-?[a-zA-Z1-9]*/.(css|js|php)(.map)?$"> deny from all </FilesMatch>

¡Gracias por toda la ayuda que pueden brindar, por alguna razón no puedo encontrar nada en este tipo de cosas en línea!

Editar:

Covenor quería algunos ejemplos, así que aquí están:

  • /anydirectory/admin-12d16m4.css

  • /anydirectory/staff.js

  • anydirectory / admin.php

Editar 2:

Gracias a Covenor, solucioné parcialmente mi problema. Aquí está mi código ahora:

RewriteCond %{REQUEST_FILENAME} -f RewriteRule (admin|staff)-?[a-zA-Z1-9]*/.(css|js|php)(.map)?$ - [F,L,NC]

Esto funciona para archivos como admin.css, admin.js, admin.css.map, pero tan pronto como implemente los archivos versionados no los oculta. Aquí hay un ejemplo de un nombre de archivo versionado: app-968b520079.css. No lo esconde, aunque no puedo encontrar un problema en mi expresión regular.

Gracias por más ayuda.

Final:

Gracias a todos los que han ayudado, el problema se ha resuelto por completo. Para cualquiera que quiera saber el código exacto que utilicé, aquí está:

RewriteCond %{REQUEST_FILENAME} -f RewriteRule (admin|staff)-?[A-Za-z0-9]*(.min)?(?(-1)(css|js)|(css.map|css|js|php))$ - [F,L,NC]

PD , no estoy seguro de a quién darle la recompensa, así que quien obtenga la mayor cantidad de votos obtendrá la recompensa.


Su primer ejemplo de "lo que probé" solo coincide cuando la URL traducida es simultáneamente un directorio y un archivo, lo que nunca es cierto. Necesita [O] unir las dos condiciones o descartar completamente la condición -d (debido a que su expresión regular coincide con cosas que comúnmente serían archivos y no directorios)

RewriteCond %{REQUEST_FILENAME} -f RewriteRule 403 (admin|staff)-?[a-zA-Z1-9]*/.(css|js|php)(.map)?$


Hay dos razones por las que no se corresponde con la aplicación-968b520079.css

El primero es el bit "aplicación", que no está contenido en

(admin | personal)

al comienzo de tu expresión regular.

Deberías cambiar eso a

(admin | personal | aplicación)

si quieres hacer coincidir algo que empiece con "aplicación-".

El segundo es el hecho de que el 968b520079 contiene dos ceros, y estás probando

[a-zA-Z1-9]

lo que significa: de la a la z, de la A a la Z y del 1 al 9

Debe probar de 0 a 9, cámbielo a

[a-zA-Z0-9]

y tu expresión regular debería funcionar bien.