【问题标题】:Apache RewriteMap Used to Prevent Direct Access to Files [closed]用于防止直接访问文件的 Apache RewriteMap [关闭]
【发布时间】:2011-12-10 01:06:33
【问题描述】:

我正在尝试使用 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 中的时间进行比较,如果它在一定范围内,则授予访问权限。

【问题讨论】:

  • 我不认为这是题外话,它显然与 LAMP 相关。

标签: apache .htaccess mod-rewrite rewritemap


【解决方案1】:

我是这样做的(你可能认为这是很多指令,但与 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 次这样的事情,但我的网络服务器仍然非常快。 (瓶颈是数据库)

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2016-03-04
    • 2016-10-09
    相关资源
    最近更新 更多