Apache-2.4

條件取決於 .htaccess 中的域:SetEnvIf 和 IfDefine?

  • September 14, 2022

我想根據域名在 .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 上讀到了 SOIfDefine ,無論如何都不是那樣工作的。真的嗎?
  • 那麼有沒有辦法做出這樣的條件呢?

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$/">
:

引用自:https://serverfault.com/questions/1110739