2011-12-10 67 views
5

我试图使用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中的时间戳与页面加载时的时间戳进行比较。

+1

我不认为这是脱离主题,它显然是LAMP相关。 – puk

回答

0

下面是我(你可能会认为这是一个很大的指令,但它的sooo快相比,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次这样的事情,我的网络服务器仍然非常快。 (瓶颈是数据库)

希望这会有帮助