2011-07-12 28 views
8

我已經採取了相當重型LAMP應用程序的開發。原始開發者使用帶有RewriteMap的.htaccess文件和PHP腳本來處理應用程序的某些條件。理解的Apache RewriteMap指令與RewriteLock

具體地,當特定的子域圖案由客戶機請求,該RewriteMap指令捕獲它們,並將它們發送到適當的應用模塊。

我與典型的mod_rewrite重定向挺舒服的,我想我已經得到了基本概念RewriteMap指令想通了;但我正在努力尋找關於RewriteLock如何工作的體面文檔。根據Apache文檔:

該指令設置了mod_rewrite需要與RewriteMap程序進行通信的同步鎖定文件的文件名。如果要使用重寫映射程序,請將此鎖定文件設置爲本地路徑(而不是掛載在NFS上的設備)。對於其他類型的重寫映射不是必需的。

但這仍然是對我來說有點含糊。 RewriteLock的確切目的和功能是什麼?它是如何工作的?

+0

+1這是我所沒有看到的mod_rewrite最解釋不清的問題之一。 – puk

回答

3

RewriteLock用於與prg:關鍵字。 RewriteMap可與多個關鍵字一起使用,以使用文本文件(txt:),散列文件(dbm:),隨機文本(rnd:)或外部映射腳本(此關鍵字爲prg:)。在這種模式下,當apache啓動時啓動外部腳本。然後爲每個到來的請求,當MOD-重寫是調用prg:映射,apache的發送輸入到該腳本並讀取輸出流來獲取值。

RewriteLock 必須使用以防止並行請求(因此並行輸入到該外部進程)混合此進程標準輸出上的答案。它是一個鎖定機制(一個文件,給定的路徑,它是一個經典的標記,只有一個用戶)來強制對這個外部映射腳本的調用進行序列化。 恕我直言,它應該透明地應用通過mod重寫時使用prg:因爲我從來沒有發現prg情況下,這種鎖定的東西不是強制性的

編輯:

其實嘛,你可以使用外部PRG:沒有rewriteLock如果輸出的隨機化是不是一個問題,即對於一個給定的條目,你可以得到它被賦予了另一種響應就像在一個腳本中做一些高級的rnd:,你自己的循環服務。但是,如果輸出必須反映條目,那麼您需要該信號量,這當然會減慢rewritemap過程。

所以,如果你只使用hashmap或textmap,你不需要設置RewriteLock。

編輯:

你可能對這個thread找到有用的信息,如鎖文件只存在幾毫秒的事實,當Apache調用PRG並等待一個答案。

編輯: 在這個問題一個奇怪的事實是:

原來開發使用的的.htaccess文件與RewriteMap指令

這很奇怪,因爲RewriteMap指令不能工作的。 htaccess文件,.htaccess是動態讀取的配置條目和here中指定的RewriteMap 上下文只能行在主配置或VirtualHost配置中設置。它不能位於位置,目錄或.htaccess中。所以這個機會絕對不會在.htaccess中起作用。

現在@puk問了一個RewriteMap用法的例子。那麼,尋找在堆棧溢出 「RewriteMap指令」 會告訴你幾個真實的例子:如果你定義了多個RewriteLock指令

+1

如果您發佈了一個示例RewriteLock/RewriteMap語句,它可能對讀者有用。我自己對mod_rewrite沒有足夠的自信。 – puk

+0

@puk:加了一些鏈接 – regilero

+0

謝謝。第三個例子很有用。不過,我想知道的是,每個RewriteMap是否需要一個RewriteLock,無論RewriteLock是否必須具有與RewriteMap相同/相似的名稱,以及是否必須以特定方式聲明(即緊接在RewriteMap指令)。這些是我在網上找不到的東西。 – puk

0

阿帕奇掛起或者你在VHOST配置中使用它。

應該在服務器配置級別和僅ONCE上指定RewriteLock。這個鎖定文件將被所有的prg類型的地圖使用。所以如果你想使用多個prg映射,我建議使用內部鎖定機制,例如在PHP中有flock函數,並且簡單地忽略apache在錯誤日誌中寫入的警告。

這裏看到更多的信息: http://books.google.com/books?id=HUpTYMf8-aEC&lpg=PP1&pg=PA298#v=onepage&q&f=false

+0

這聽起來不正確。如果兩個Apache線程一次向'prg'發送請求會怎麼樣?即使你在他們內部使用了flock(),哪個回覆會去哪個請求?這被破壞了,因此是錯誤的建議。不應該''prg'對某些第三個資源的訪問被鎖定,但是Apache訪問prg。 – catpnosis