使用RewriteLock了解Apache RewriteMap

Bri*_*acy 8 apache mod-rewrite lamp

我接管了一个相当重型的LAMP应用程序的开发.原始开发人员使用带有RewriteMap的.htaccess文件和PHP脚本来处理应用程序的某些条件.

具体来说,当客户端请求某些子域模式时,RewriteMap会捕获它们并将它们发送到适当的应用程序模块.

我对典型的mod_rewrite重定向很满意,我想我已经找到了基本的RewriteMap概念; 但我很难找到关于RewriteLock如何工作的体面文档.根据Apache文档:

该指令设置同步锁文件的文件名,mod_rewrite需要与RewriteMap程序通信.如果要使用重写映射程序,请将此锁定文件设置为本地路径(不在NFS挂载设备上).其他类型的重写映射不需要它.

但这对我来说仍然有点模糊.什么是RewriteLock的确切目的和功能,它是如何工作的?

reg*_*ero 3

RewriteLock 与关键字一起使用prg:RewriteMap可以与多个关键字一起使用,以使用文本文件 ( txt:)、哈希文件 ( dbm:)、随机文本 ( rnd:) 或外部映射脚本(这一个是prg:关键字)。在此模式下,外部脚本在 apache 启动时启动。然后,对于每个传入请求,当 mod-rewrite 调用映射时prg:,apache 会将输入发送到该脚本并读取输出流以获取值。

在这种情况下必须使用RewriteLock来防止并行请求(因此并行输入到该外部进程)在此进程标准输出上混合答案。它是一种锁定机制(一个文件、给定路径、一个经典令牌、只有一个用户),用于强制对该外部映射脚本的调用进行序列化。恕我直言,在使用 prg 时,应该通过 mod-rewrite 透明地应用它:因为我从未发现 prg 情况下这种锁定不是强制性的

编辑:

事实上,您可以使用外部 prg:如果输出的随机化不是问题,则无需 rewriteLock,即对于给定的条目,您可以获得为另一个条目给出的响应,就像在执行一些高级 rnd 的脚本中一样:,您自己的循环服务。但是,如果输出必须反映条目,那么您就需要该信号量,这当然会减慢重写映射过程。

因此,如果您仅使用哈希图或文本图,则无需设置 RewriteLock。

编辑:

您可能会发现有关此线程的有用详细信息,例如当 apache 调用 prg 并等待答案时,锁定文件仅存在几毫秒。

编辑: 关于这个问题,一个奇怪的事实是:

原始开发人员使用带有 RewriteMap 的.htaccess文件

这很奇怪,因为 RewriteMap 无法处理 .htaccess 文件,.htaccess 是动态读取的配置条目,而Context行中所述的 RewriteMap只能在主配置或 VirtualHost 配置中设置。它不能位于位置、目录或 .htaccess 中。所以这很可能永远不会在 .htaccess 中起作用。

现在@puk 要求提供 RewriteMap 用法的示例。好吧,在 Stack Overflow 中搜索“RewriteMap”将会向您展示几个真实的例子:

  • 我觉得很搞笑的是,Apache 允许您在没有“RewriteLock”的情况下使用“prg”,几乎没有记录这是一个坏主意,因此默认为“随机交换同时请求定向到的 URL”的行为*如果您在没有仔细阅读文档的情况下尝试使用“prg”。仅仅为了防止人们的请求被随机交换而需要巫术咒语是疯狂的设计;我看不出事情会变成这样。 (2认同)