條件取決於 .htaccess 中的域:SetEnvIf 和 IfDefine?
我想根據域名在 .htaccess 中添加一個“做某事”(實際上啟用 httpauth 使用者限制)的規則。
我以為我擁有它並做到了:
<IfModule mod_setenvif.c> SetEnvIf Host "staging\.(.*)\.ch" HTTPAUTHPROTECT=true <IfDefine HTTPAUTHPROTECT> # Do something # For testing, I used the following line: # SetEnvIf Host "staging\.(.*)\.ch" CONDITIONMATCHED=conditionmatched </IfDefine> </IfModule>
在執行 Litespeed 的伺服器上,我認為這是可行的。也許我錯了,這
<IfDefine HTTPAUTHPROTECT>
部分總是返回 true。在另一台使用 Apache (2.4.54) 的伺服器上,無論 ENV var 設置為什麼,它都會一直返回 false。
- 我在 Apache 上讀到了 SO
IfDefine
,無論如何都不是那樣工作的。真的嗎?- 那麼有沒有辦法做出這樣的條件呢?
PS:我不是指重寫規則。我想有條件地執行的程式碼是:
AuthType Basic AuthName "Login" AuthUserFile "/path/to/.htpasswd" Require valid-user
<IfDefine>
LiteSpeed 可能不支持,所以它被“忽略”並且內容被無條件執行(錯誤日誌中可能有一些東西)。在 Apache 上
<IfDefine>
檢查伺服器定義的變數(例如,帶有或在帶有標誌Define <var>
的 Apache 命令行上)。-D
它不檢查環境變數,因此表達式在 Apache 上始終為false並且內容從不執行。在 Apache 上,您可以使用 Apache
<If>
表達式(需要 Apache 2.4)並檢查環境變數。例如:SetEnvIf Host "^staging\..+\.ch$" HTTPAUTHPROTECT=true <If "reqenv('HTTPAUTHPROTECT') == 'true'"> AuthType Basic AuthName "Login" AuthUserFile "/path/to/.htpasswd" Require valid-user </If>
但是,我不能確定這是否適用於 LiteSpeed,它在其“Apache”支持方面往往更接近 Apache 2.2。
此外,在 Apache 上,如果在目錄上下文(例如
.htaccess
)中使用它並且您還執行 URL 重寫(這會觸發重寫引擎的“循環”),那麼您可能需要REDIRECT_HTTPAUTHPROTECT
在<If>
表達式中進行檢查。這是因為,在初始階段設置的任何 env varREDIRECT_
在後續傳遞中都會使用前綴重命名。請注意,如果這是您使用 env var 的唯一用途,那麼您可以
Host
直接在<If>
表達式中檢查標頭(不需要 env var)。例如:<If "%{HTTP_HOST} =~ /^staging\..+\.ch$/"> :