2009-09-22 71 views
1

我已經編寫了一個模塊來設置mod-rewrite使用的Apache環境變量。它掛鉤到ap_hook_post_read_request()並且工作正常,但是如果mod重寫匹配RewriteRule,那麼它會通過重寫的URL對我的請求處理程序進行第二次調用。這看起來像一個新的請求,我的環境變量不再設置,因此我必須執行我的(昂貴)代碼每次擊中兩次。Mod重寫的雙重請求

我在做什麼錯,或者有沒有解決這個問題?

感謝

回答

1

您可以使用規則中的[NS]修改,以使其不爲內部子請求(你看到第二遍是內部子)進行處理。

+0

感謝您的回覆。不幸的是,這似乎不適用於我。我也嘗試在規則中設置一個env var(比如[E = DONE:YES]),並在我的請求處理程序中檢測它,但是不行。 – Dave 2009-09-22 20:05:36

+0

@Dave:你嘗試過'REDIRECT_DONE'而不是'DONE'嗎? – Gumbo 2009-09-22 21:45:08

+0

謝謝,剛剛嘗試過。仍然沒有去。我還試着在 的名稱前加上HTTP_(例如HTTP_REQUEST_DONE),因爲我在某個線程中發現了該名稱。你會認爲mod-rewrite(或Apache)會在子請求期間保留環境,或者設置一些我可以看到的說它是子請求。 – Dave 2009-09-22 23:27:11

1

據我所知,一個規則中的NS標誌(在另一個答案中提出)使其評價爲「如果我被第二次調用,不理我」。麻煩的是,到那時候已經調用鉤子爲時已經太晚了。無論你在mod_rewrite中做什麼,我相信這都會成爲問題。您可以檢測到第二個請求,但我不知道有任何方法可以阻止的第二個請求

我最好的建議是把你的處理程序中的檢測放在你的(昂貴的)代碼之前,如果它正在被第二次運行,則退出。你可以讓mod_rewrite在URL中附加一些東西,這樣你就可以知道什麼時候第二次被調用了。

但是......

如果你的(昂貴的)代碼被調用每個請求,它也被稱爲上的圖像,CSS文件,網站圖標,等你真正想要的是什麼?或者這可能是你第二次打來的電話?

1

非常感謝,我做了一些類似於bmb的建議,它的工作原理!但是,而不是在這個在所有涉及國防部重寫,我在模塊的請求處理程序增加了一個「假」的請求頭,就像這樣:

apr_table_set(r->headers_in, "HTTP_MY_MODULE", "yes"); 

然後,我可以在我的處理程序的第二頂部檢測到它重寫請求。原來,即使mod-rewrite(或Apache?)不​​保留子請求中添加的env或notes變量(r-> subprocess_env,r-> notes),它也會保留添加的頭文件。

至於我的昂貴的代碼被調用的每個請求,我有一個可配置的URL後綴/擴展過濾器在處理程序忽略圖像等請求。