簡體   English   中英

用 RewriteLock 理解 Apache RewriteMap

[英]Understanding Apache RewriteMap with RewriteLock

我已經接管了一個相當繁重的 LAMP 應用程序的開發。 原始開發人員使用帶有 RewriteMap 的 .htaccess 文件和 PHP 腳本來處理應用程序的某些條件。

具體來說,當客戶端請求某些子域模式時,RewriteMap 會捕獲它們並將它們發送到適當的應用程序模塊。

我對典型的 mod_rewrite 重定向很滿意,而且我想我已經弄清楚了基本的 RewriteMap 概念; 但我很難找到關於 RewriteLock 如何工作的體面文檔。 根據 Apache 文檔:

該指令設置 mod_rewrite 需要與 RewriteMap 程序通信的同步鎖文件的文件名。 當您想使用重寫映射程序時,將此鎖定文件設置為本地路徑(而不是安裝在 NFS 的設備上)。 其他類型的重寫映射不需要它。

但這對我來說仍然有點模糊。 RewriteLock 的確切用途和 function 是什么,它是如何工作的?

RewriteLock 與prg:關鍵字一起使用。 RewriteMap可以與多個關鍵字一起使用,以使用文本文件 ( txt: :)、哈希文件 ( dbm: :)、隨機文本 ( rnd: :) 或外部映射腳本(這個是prg:關鍵字)。 在這種模式下,外部腳本在 apache 啟動時啟動。 然后對於每個傳入的請求,當 mod-rewrite 調用prg:映射時,apache 將輸入發送到該腳本並讀取 output stream 以獲取值。

在這種情況下,必須使用 RewriteLock 來防止並行請求(因此並行輸入到該外部進程)在此進程標准 output 上混合答案。 這是一種鎖定機制(一個文件,給定的路徑,這是一個經典的令牌,只有一個用戶)來強制對這個外部映射腳本的調用進行序列化。 恕我直言,在使用 prg 時應該由 mod-rewrite 透明地應用它:因為我從未發現這種鎖定事物不是強制性的 prg 情況

編輯:

事實上,你可以使用外部 prg: 如果 output 的隨機化沒有問題,則無需 rewriteLock,即對於給定條目,您可以獲得為另一個條目給出的響應,例如在執行一些高級 rnd 的腳本中:,您自己的循環服務。 但是如果 output 必須反映條目,那么您需要那個信號量,這當然會減慢 rewritemap 過程。

因此,如果您只使用 hashmap 或 textmap,則無需設置 RewriteLock。

編輯:

您可能會在此線程上找到有用的詳細信息,例如當 apache 調用 prg 並等待答案時,鎖定文件僅存在幾毫秒的事實。

編輯:關於這個問題,一個奇怪的事實是:

原始開發人員使用了帶有 RewriteMap 的.htaccess文件

這很奇怪,因為 RewriteMap 無法在 .htaccess 文件上工作,.htaccess 是動態讀取的配置條目,並且上下文行中所述RewriteMap 只能在主配置或 VirtualHost 配置中設置。 它不能位於位置、目錄或 .htaccess 中。 所以很有可能這在 .htaccess 中永遠不會起作用。

現在@puk 要求提供 RewriteMap 用法的示例。 好吧,在 Stack Overflow 中搜索“RewriteMap”會給你展示幾個真實的例子:

如果您定義多個 RewriteLock 指令或在 VHOST 配置中使用它,Apache 會掛起。

RewriteLock 應該在服務器配置級別指定,並且只指定一次。 此鎖定文件將被所有 prg 類型映射使用。 因此,如果您想使用多個 prg 映射,我建議使用內部鎖定機制,例如在 PHP 中有群 function,而只需忽略警告 ZB6EFD606D118D0F62066E31419FF04 寫入錯誤日志。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM