5

我正在尝试使用 RewriteMap 函数的结果有条件地允许访问目录。
目的是从 cookie (my_cookie) 中读取时间戳并将其传递到我在 httpd.conf 中定义的 RewriteMap (my_rewrite_map_func) 中(如果时间戳在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 文件来保护 html 文件免受 php 脚本的影响。

无论如何,上面的代码在与另外两行结合使用来处理 cookie 不存在的情况时可以完美地工作:

RewriteCond %{HTTP_COOKIE} !^.*my_cookie.*$ [NC]
RewriteRule ^(.*)$ / [NC,L,QSA,F]

希望这将帮助其他在同一问题上遇到困难的人;在网络上的其他地方似乎没有什么成功。

我的具体案例涉及防止直接访问 html 和其他文件而不直接修改它们或使用下载脚本。PHP 代码用于生成包含指向这些文件的链接的页面,Javascript 从中执行 ajax 调用以检索服务器的时间戳并设置 cookie。cookie 中的时间戳与 Apache 在页面加载时的时间进行比较,如果它在某个范围内,则授予访问权限。

4

1 回答 1

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 次这样的事情,但我的网络服务器仍然非常快。(瓶颈是数据库)

希望这可以帮助

于 2011-12-10T06:56:22.017 回答