【问题标题】:Understanding Apache RewriteMap with RewriteLock用 RewriteLock 理解 Apache RewriteMap
【发布时间】:2011-10-03 06:11:29
【问题描述】:

我已经接管了一个相当繁重的 LAMP 应用程序的开发工作。最初的开发者使用一个带有 RewriteMap 的 .htaccess 文件和一个 PHP 脚本来处理应用程序的某些条件。

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

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

该指令设置 mod_rewrite 需要与 RewriteMap 程序通信的同步锁文件的文件名。当您想使用重写映射程序时,将此锁定文件设置为本地路径(而不是安装在 NFS 的设备上)。其他类型的重写映射不需要。

但这对我来说还是有点模糊。 RewriteLock 的具体用途和功能是什么?它是如何工作的?

【问题讨论】:

  • +1 这是我所见过的 Mod_Rewrite 最难解释的方面之一。

标签: apache mod-rewrite lamp


【解决方案1】:

如果您定义了多个 RewriteLock 指令或在 VHOST 配置中使用它,Apache 将挂起。

应该在服务器配置级别指定 RewriteLock,并且只指定一次。此锁定文件将被所有 prg 类型映射使用。所以如果你想使用多个prg映射,我建议使用内部锁定机制,例如在PHP中有flock函数,并且简单地忽略apache在错误日志中写入的警告。

查看此处了解更多信息: http://books.google.com/books?id=HUpTYMf8-aEC&lpg=PP1&pg=PA298#v=onepage&q&f=false

【讨论】:

  • 这听起来不正确。如果两个 Apache 线程同时向prg 发送请求怎么办?即使您在其中使用了flock(),哪个回复也会针对哪个请求?这是被破坏的,因此是错误的建议。不是prg 对第三个资源的访问应该被锁定,而是Apache 对prg 的访问。
【解决方案2】:

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

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

编辑:

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

因此,如果您只使用 hashmap 或 textmap,则无需设置 RewriteLock。

编辑:

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

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

最初的开发者使用了一个带有 RewriteMap 的 .htaccess 文件

这很奇怪,因为 RewriteMap 无法处理 .htaccess 文件,.htaccess 是动态读取的配置条目,并且 Context 行中 here 中所述的 RewriteMap 只能在主配置或虚拟主机配置。它不能位于位置、目录或 .htaccess 中。所以很有可能这永远不会在 .htaccess 中工作。

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

【讨论】:

  • 如果您发布了一个示例 RewriteLock/RewriteMap 语句,它可能对读者有用。我对 mod_rewrite 自己没有足够的信心来做这件事。
  • 谢谢。第三个例子很有用。但是,我特别想知道的是每个 RewriteMap 是否需要一个 RewriteLock,该 RewriteLock 是否必须与 RewriteMap 具有相同/相似的名称,以及它是否必须以特定方式声明(即紧接在重写映射)。这些是我在网上找不到的。
  • @puk:我没有答案,除了我认为每个虚拟主机只需要/可用一个 rewriteLock 并且您可以在虚拟主机或全局配置中的任何位置设置该指令。但我不确定,这是一个关于 apache 开发列表的好问题。
  • 我的重写映射实际上是在我的 apache 配置文件中定义的,而不是在我的 VHost 文件中。还是谢谢你。
  • 我发现 Apache 允许您在没有 RewriteLock 的情况下使用 prg 非常有趣,几乎没有证明这是一个坏主意,因此默认为随机交换的行为如果您尝试使用prg 而不首先仔细阅读文档,则围绕同时请求被定向到的 URL。要求巫毒咒语只是为了防止人们的请求被随机交换是疯狂的设计;我看不出有什么好的理由让事情变成这样。
猜你喜欢
  • 1970-01-01
  • 2013-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2018-09-30
  • 1970-01-01
相关资源
最近更新 更多