rewriterule - the mod_rewrite apache module
Apache RewriteMap se usa para evitar el acceso directo a los archivos (1)
Estoy tratando de usar el resultado de una función RewriteMap para permitir el acceso condicional a un directorio.
La intención es leer una marca de tiempo de una cookie (my_cookie) y pasarla a RewriteMap (my_rewrite_map_func) que he definido en httpd.conf (Es un ejecutable que echos las cadenas "TRUE" o "FALSE" para stdout si la marca de tiempo en la cookie está dentro de un cierto rango de la hora actual en Apache).
RewriteMap my_rewrite_map_func prg:/var/www/program
Los contenidos de mi archivo .htaccess son:
RewriteEngine On
RewriteCond %{HTTP_COOKIE} my_cookie=([^;]+) [NC]
RewriteCond ${my_rewrite_map_func:%{TIME}%1|FALSE},FALSE ^([^,]+),/1 [NC]
RewriteRule ^(.*)$ / [NC,L,QSA,F]
Puedo confirmar que el programa en sí está funcionando, que la cookie se está leyendo y que la marca de tiempo de Apache y la fecha y hora de la cookie están dentro del rango permitido.
La expresión regular en el segundo RewriteCond comprueba si el valor de retorno de $ {my_rewrite_map_func:% {TIME}% 1 | FALSE} es FALSE, sin embargo, independientemente de lo que establecí, el RewriteRule nunca se produce.
Esencialmente, no puedo determinar cómo evaluar el valor de $ {my_rewrite_map_func:% {TIME}% 1 | FALSE}. ¿Hay alguna manera de que pueda extraer o almacenar mejor el valor de esto?
Cualquier ayuda sería muy apreciada.
ACTUALIZACIÓN - SOLUCIÓN: no estoy seguro de por qué esta pregunta se marcó como fuera de tema, se relaciona con la protección de archivos html de un script php por medio de un archivo .htaccess de Apache usando mod_rewrite para llamar a un programa C ++.
A pesar de todo, el código anterior funciona perfectamente cuando se usa junto con dos líneas adicionales para manejar el caso de que la cookie no exista:
RewriteCond %{HTTP_COOKIE} !^.*my_cookie.*$ [NC]
RewriteRule ^(.*)$ / [NC,L,QSA,F]
Esperamos que esto ayude a otros que han tenido dificultades con el mismo problema; parece que ha habido poco éxito con esto en otro lugar en la web.
Mi caso específico se refiere a la prevención del acceso directo a html y otros archivos sin modificarlos directamente, o mediante un script de descarga. El código PHP se usa para generar una página con enlaces a estos archivos, desde donde Javascript realiza una llamada ajax para recuperar la marca de tiempo del servidor y establece una cookie. La marca de tiempo en la cookie se compara con el tiempo en Apache en la carga de la página, si está dentro de un cierto rango, se concede acceso.
Así es como lo hago (puede pensar que es un montón de instrucciones, pero es tan rápido en comparación con el manejo de PHP que no debe preocuparse por 5 (o algo) cond en lugar de 2 (o algo)):
RewriteEngine On
RewriteCond %{HTTP_COOKIE} my_cookie=([^;]+) [NC]
# Don''t touch anything but create MYCOOKIE environment
# and set it to empty if not found:
RewriteRule . - [E=MYCOOKIE:${my_rewrite_map_func:%{TIME}%1|}]
# If the environment was found = not empty:
RewriteCond %{E:MYCOOKIE} !^$ [NC]
# ... then process a rewrite rule:
RewriteRule [blabla...blabla]
Hago cosas así 50 veces y mi servidor web sigue siendo increíblemente rápido. (el cuello de botella es la base de datos)
Espero que esto ayude