Pregunta htaccess que permite acceder a los archivos por extensión?


Vi varios ejemplos de htaccess que deshabilitaban algunos archivos para acceder:

<Files ~ "\.(js|sql)$">
   order deny,allow
   deny from all
</Files>

por ejemplo, esto impide acceder a todos los archivos .JS y .SQL, los demás están habilitados. Quiero lo contrario! Quiero que esos archivos estén HABILITADOS, todos los demás se prevengan. ¿Cómo lograr esto?


19
2017-10-16 21:52


origen


Respuestas:


La respuesta de Vorapsak es casi correcta. Es en realidad

order allow,deny
<Files ~ "\.(js|sql)$">
   allow from all
</Files>

Necesitas la directiva de orden en la parte superior (y no necesitas nada más).

Lo interesante es que parece que no podemos simplemente negar la expresión regular en FilesMatch, lo cual es ... extraño, especialmente desde el "!" no causa errores del servidor ni nada. Bueno, duh.


y un poco de explicación:

La causa del pedido le dice al servidor sobre su comportamiento predeterminado esperado. los

 order allow,deny

le dice al servidor que procese primero las directivas "permitir": si una solicitud coincide con cualquier directiva allow, está marcada como correcta. Luego, se evalúan las directivas de "denegación": si una solicitud coincide con las directivas de denegación, se deniega (no importa si se permitió en la primera pasada). Si no se encontraron coincidencias, el archivo es denegado.

La directiva

 order deny,allow

funciona de la manera opuesta: primero, el servidor procesa las directivas "denegar": si una solicitud coincide, se marca como denegada. Luego, se evalúan las directivas de "permitir": si una solicitud coincide con una directiva allow, está permitida, incluso si coincide con una directiva de denegación anterior. Si una solicitud no coincide con nada, el archivo está permitido.

En este caso específico, el servidor primero intenta hacer coincidir las directivas allow: ve que los archivos js y sql están permitidos, por lo que se realiza una solicitud a foo.js; una solicitud a bar.php no coincide con ninguna directiva, por lo que se rechaza.

Si cambiamos la directiva a "order deny, allow", entonces foo.js pasará (por ser un js), y bar.php también pasará, ya que no coincide con ningún patrón.


Ah, y una cosa más: directivas en una sección (es decir, <Archivos> y <Directorio>) siempre se evalúan después el cuerpo principal del archivo .htaccess, sobrescribiéndolo. Es por eso que la solución de Vorapsak no funcionó como se esperaba: el .htaccess principal denegó la solicitud, luego se procesó el pedido de <Archivos> y permitió la solicitud.

Htaccess es magia de la peor clase, pero tiene lógica.


36
2017-10-16 23:30



¿Trataste de establecer un

deny from all

fuera (antes) de la etiqueta, luego cambiando la

deny from all

a

allow from all

¿dentro? Algo como

deny from all
<Files ~ "\.(js|sql)$">
   order allow,deny
   allow from all
</Files>

0
2017-10-16 22:01



Puede cambiar el permiso de archivo a "600", por lo que puede acceder a él a través de su secuencia de comandos y le negará el acceso directo.

<?php
   // Read and write for owner, nothing for everybody else
   chmod("/somedir/somefile", 0600);
?>

http://php.net/manual/en/function.chmod.php


0
2017-12-22 20:10