我接管了一个相当重型的LAMP应用程序的开发。原始开发人员使用带有RewriteMap的.htaccess文件和PHP脚本来处理应用程序的某些条件。
具体来说,当客户端请求某些子域模式时,RewriteMap会捕获它们并将它们发送到相应的应用程序模块。
我对典型的mod_rewrite重定向很满意,我想我已经找到了基本的RewriteMap概念;但我很难找到关于RewriteLock如何工作的体面文档。根据Apache文档:
该指令设置同步锁文件的文件名,mod_rewrite需要与RewriteMap程序进行通信。如果要使用重写映射程序,请将此锁定文件设置为本地路径(不在NFS挂载设备上)。其他类型的重写映射不需要它。
但对我来说这仍然有点模糊。什么是RewriteLock的确切目的和功能以及它是如何工作的?
答案 0 :(得分:3)
RewriteLock与prg:
关键字一起使用。 RewriteMap 可与多个关键字一起使用,以使用文本文件(txt:
),哈希文件(dbm:
),随机文本(rnd:
)或外部映射脚本(这个是prg:
关键字)。在此模式下,外部脚本在apache启动时启动。然后,对于每个传入请求,当mod-rewrite调用prg:
映射时,apache会向该脚本发送输入并读取输出流以获取值。
在这种情况下必须使用RewriteLock 来防止并行请求(因此对该外部进程的并行输入)在此过程标准输出上混合答案。它是一种锁定机制(文件,给定路径,它是一个经典令牌,只有一个用户)来强制执行对此外部映射脚本的调用的序列化。 恕我直言,当使用prg时,应该通过mod-rewrite透明地应用它:因为我从未发现这种锁定事物不是强制性的的prg情况。
修改:
实际上你可以使用外部prg:如果输出的随机化不是问题,则不使用rewriteLock,即对于给定的条目,你可以获得为另一个条目提供的响应,比如在执行某些高级的脚本中rnd :,你自己的循环服务。但是如果输出必须反映条目,那么你需要那个信号量,这当然会减慢重写映射过程。
因此,如果您只使用hashmap或textmap,则无需设置RewriteLock。
修改:
你可能会发现这个thread的有用细节,比如当apache调用prg并等待答案时锁文件只存在几毫秒的事实。
修改强> 关于这个问题,一个奇怪的事实是:
原始开发人员使用带有RewriteMap的 .htaccess 文件
这很奇怪,因为RewriteMap不能用于.htaccess文件,.htaccess是动态读取的配置条目,而 Context 行中所述的here的RewriteMap只能在主配置中设置或者在VirtualHost配置中。它不能位于位置,目录或.htaccess中。所以很有可能这在.htaccess中永远不会起作用。
现在@puk要求提供RewriteMap用法的示例。那么,在Stack溢出中搜索“RewriteMap”会向你展示几个真实的例子:
答案 1 :(得分:0)
如果您定义了多个RewriteLock指令或者在VHOST配置中使用它,Apache会挂起。
RewriteLock应在服务器配置级别指定,并且仅在ONCE上指定。所有prg类型映射都将使用此锁定文件。因此,如果您想使用多个prg映射,我建议使用内部锁定机制,例如在PHP中有flock函数,并且只是忽略错误日志中的警告apache写入。
有关详细信息,请参阅此处: http://books.google.com/books?id=HUpTYMf8-aEC&lpg=PP1&pg=PA298#v=onepage&q&f=false