Bri*_*acy 8 apache mod-rewrite lamp
我接管了一个相当重型的LAMP应用程序的开发.原始开发人员使用带有RewriteMap的.htaccess文件和PHP脚本来处理应用程序的某些条件.
具体来说,当客户端请求某些子域模式时,RewriteMap会捕获它们并将它们发送到适当的应用程序模块.
我对典型的mod_rewrite重定向很满意,我想我已经找到了基本的RewriteMap概念; 但我很难找到关于RewriteLock如何工作的体面文档.根据Apache文档:
该指令设置同步锁文件的文件名,mod_rewrite需要与RewriteMap程序通信.如果要使用重写映射程序,请将此锁定文件设置为本地路径(不在NFS挂载设备上).其他类型的重写映射不需要它.
但这对我来说仍然有点模糊.什么是RewriteLock的确切目的和功能,它是如何工作的?
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”将会向您展示几个真实的例子: