使用RewriteLock了解Apache RewriteMap

时间:2011-07-12 00:53:58

标签: apache mod-rewrite lamp

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

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

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

  

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

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

2 个答案:

答案 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