如何 使用 RewriteCond創建以下邏輯: (A 和 B)或(C 和 D)?
這里的檔案不是很清楚,所以我希望一些專家可能會有所啟發。
我查看了以下帖子: 如何在 Apache 上為 RewriteCond 使用“AND”、“OR”? 這個對于給定的例子來說有點清楚,但我仍然有點卡住了。
以下面的例子為例。如果我需要(A 和 B)或(C 和 D),這是否正確?或者是A和(B或C)和D?
RewriteCond A
RewriteCond B [OR]
RewriteCond C
RewriteCond D
以下是(A和B和C)或D,還是A和B和(C或D)?
RewriteCond A
RewriteCond B
RewriteCond C [OR]
RewriteCond D
通過將它們拆分為多個 RewriteRules 來解決它的唯一方法是什么?
uj5u.com熱心網友回復:
注意:所有代碼示例都是半偽代碼,除非另有說明。
這是一個有趣的問題,然而,您如何實際實作這樣的東西實際上取決于您想要實作的目標。有幾種方法/技術可以完成作業。
你不能像你的例子那樣從字面上實作這個邏輯,即。有 4 個條件:A、B、C 和 D。并使用OR和(隱含的)AND標志。這是因為條件以從上到下的順序處理,OR優先于將隱含AND并且沒有語法組條件一起(比分裂成單獨的規則等)。
RewriteCond A RewriteCond B [OR] RewriteCond C RewriteCond D
這相當于A and (B or C) and D. 如果不滿足條件,處理會提前停止。因此,在此示例中,如果A失敗,則不會進行進一步的處理。
RewriteCond A RewriteCond B RewriteCond C [OR] RewriteCond D
這相當于A and B and (C or D).
如何使用 RewriteCond創建以下邏輯:(A 和 B)或(C 和 D)?
一般而言,根據預期的操作,有多種方法可以實作此邏輯。在 Apache 2.4 上,您可以在RewriteCond指令中嵌入 Apache 運算式,因此您可以更直接地執行以下操作:
RewriteCond expr "A && B" [OR]
RewriteCond expr "C && D"
(盡管這甚至可以合并為一個條件。)
或者,<If>直接使用 Apache運算式。例如:
<If "(A && B) || (C && D)">
RewriteRule ^ something
</If>
在早期版本的 Apache 上,您可以根據早期條件的結果使用環境變數(存盤中間運算式的結果)和/或跳過規則。
例如:
# If "A and B" then env var is set and the next rule is skipped
RewriteCond A
RewriteCond B
RewriteRule ^ - [E:A_AND_B:1,S=1]
# If "C and D" then env var is set
RewriteCond C
RewriteCond D
RewriteRule ^ - [E:C_AND_D:1]
RewriteCond A_AND_B [OR]
RewriteCond C_AND_D
RewriteRule <do-this>
雖然你不需要上面的兩個環境變數 - 一個就可以:
# If "A and B" then env var is set and the next rule is skipped
RewriteCond A
RewriteCond B
RewriteRule ^ - [E:SUCCESS:1,S=1]
# If "C and D" then env var is set
RewriteCond C
RewriteCond D
RewriteRule ^ - [E:SUCCESS:1]
# If neither "A and B" or "C and D" is set then SUCCESS is also not set
RewriteCond SUCCESS
RewriteRule <do-this>
或者,一起跳過和鏈接規則(不需要 env var):
# If "A and B" then skip the next rule that checks "C and D"
RewriteCond A
RewriteCond B
RewriteRule ^ - [S=1]
# If "C and D" then chain to the next rule
RewriteCond C
RewriteCond D
RewriteRule ^ - [C]
# (A and B) or (C and D) - Otherwise this rule is skipped
RewriteRule <do-this>
However, depending on what you are doing you can also be creative with regex and "link" conditions together using backreferences to earlier conditions. For example, see my answer to the following question: Apache mod_rewrite/mod_redirect: convert URL with query parameters into an SEO-friendly URL. some query parameters are ignored
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/350137.html
