我正在尝试使用RewriteMap函数的结果来有条件地允许访问目录 目的是从cookie(my_cookie)中读取时间戳并将其传递到我在httpd.conf中定义的RewriteMap(my_rewrite_map_func)(如果时间戳在时间,它是一个可执行文件,它将字符串“TRUE”或“FALSE”发送到stdout cookie在Apache的当前时间的某个范围内)。
RewriteMap my_rewrite_map_func prg:/var/www/program
我的.htaccess文件的内容是:
RewriteEngine On
RewriteCond %{HTTP_COOKIE} my_cookie=([^;]+) [NC]
RewriteCond ${my_rewrite_map_func:%{TIME}%1|FALSE},FALSE ^([^,]+),\1 [NC]
RewriteRule ^(.*)$ / [NC,L,QSA,F]
我可以确认程序本身正在运行,正在读取cookie,并且Apache时间戳和cookie时间戳都在允许的范围内。
第二个RewriteCond上的正则表达式检查$ {my_rewrite_map_func:%{TIME}%1 | FALSE}的返回值是否为FALSE,但是,无论我将其设置为什么,RewriteRule都不会发生。
基本上,我无法确定如何评估$ {my_rewrite_map_func:%{TIME}%1 | FALSE}的值。有没有办法可以更好地提取或存储它的价值?
非常感谢任何帮助。
更新 - 解决方案: 我不确定为什么这个问题被标记为偏离主题,它涉及通过使用mod_rewrite调用C ++程序的Apache .htaccess文件来保护PHP脚本中的html文件。
无论如何,上面的代码与另外两行一起使用时可以很好地处理不存在cookie的情况:
RewriteCond %{HTTP_COOKIE} !^.*my_cookie.*$ [NC]
RewriteRule ^(.*)$ / [NC,L,QSA,F]
希望这会帮助那些在同一问题上遇到困难的人;网上其他地方似乎没有什么成功。
我的具体案例涉及阻止直接访问html和其他文件而不直接修改它们,或者使用下载脚本。 PHP代码用于生成包含指向这些文件的链接的页面,Javascript从中执行ajax调用以检索服务器的时间戳并设置cookie。将cookie中的时间戳与Apache在页面加载时的时间进行比较,如果它在一定范围内,则授予访问权限。
答案 0 :(得分:0)
这就是我的工作方式(你可能会认为它有很多指令,但与PHP处理相比,它太快了你不应该担心5(或其他)cond而不是2(或其他)):
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]
我做了50次这样的事情,我的网络服务器仍然非常快。 (瓶颈是数据库)
希望这有帮助