我试图使用RewriteMap函数的结果来有条件地允许访问目录。
目的是从cookie(my_cookie)中读取一个时间戳,并将其传递到我在httpd.conf中定义的RewriteMap(my_rewrite_map_func)(这是一个可执行文件,它将字符串“TRUE”或“FALSE”回显为标准输出cookie中的时间戳在Apache中当前时间的一定范围内)。Apache RewriteMap用于防止直接访问文件
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文件来保护HTML文件从一个PHP脚本++程序。
无论如何,在配合使用时,有两个额外的线路来处理该cookie不存在的情况下,上面的代码工作完美:
RewriteCond %{HTTP_COOKIE} !^.*my_cookie.*$ [NC]
RewriteRule ^(.*)$/[NC,L,QSA,F]
希望这将有助于其他人谁也经历了同样的问题的难度;在网络上的其他地方似乎没有什么成功。
我的具体案例涉及防止直接访问html和其他文件,而无需直接修改它们或使用下载脚本。 PHP代码用于生成一个包含这些文件链接的页面,Javascript通过该页面执行ajax调用以检索服务器的时间戳并设置cookie。如果在授权的访问范围内,cookie中的时间戳与页面加载时的时间戳进行比较。
我不认为这是脱离主题,它显然是LAMP相关。 – puk