Apache-2.2

在 Apache mod rewrite 中動態設置 RequestHeader 主機

  • September 12, 2016

我正在使用 Apache mod_rewrite,我希望根據 QUERY_STRING 中的域動態設置Host標頭。RequestHeader我將如何動態設置Host

給定以下請求 URL:

https://example.com/p12?url=http://nonssldomain.com/331551/1041505584.jpg?dt=032620151151

我試過的:

RewriteCond %{QUERY_STRING} ^url=(.*)$ [NC]   

#some regex to parse domain from Query_String (Doesn't work)
RequestHeader set Host ^(?:https?:\/\/)?(?:[^@\n]+@)?(?:www\.)?([^:\/\n]+)
RewriteRule ^.*/p12$ %1? [P,NC,L]

我需要先動態設置一個變數嗎?

解決方法如下

這個正則表達式使我們能夠獲取整個查詢字元串以及主機的域。%1 為我們提供了整個查詢參數,%2 為我們提供了域。正則表達式範例可以在這裡找到https://regex101.com/r/dC0xZ4/2

RewriteCond %{QUERY_STRING} url=((?:https?://)?(?:[^@\n]+@)?(?:www\.)?([^:/\n]+).*) [NC]

當我們看到 p12 時,如果重寫條件為真,我們代理 %1 並設置我們的新主機環境變數。

 RewriteRule ^.*/p12$ %1 [P,NC,L,E=new_host:%2]

您需要檢查 new_host 環境變數是否存在,否則您將主機設置為空。

 <If "-T reqenv('new_host')">
   //Set host with new_host variable
   RequestHeader set Host %{new_host}e
 </If>

您有以下聲明:

RequestHeader set Host ^(?:https?:\/\/)?(?:[^@\n]+@)?(?:www\.)?([^:\/\n]+)

如果您查看該RequestHeader指令,它會說:

對於set, append,mergeadd一個值作為第三個參數給出。

因此,您的模式實際上被​​視為價值。相反,你應該做的是

  1. 使用<If>指令查看您的請求是否適用於p12?url=
  2. 在子句中使用SetEnvIf指令<if>將一些自定義環境變數動態設置為最後您想要的值(假設它是my_new_host:)
  3. 添加RequestHeader帶有 的語句%{my_new_host}e作為其第三個參數。

嘗試以下操作:

<If "%{QUERY_STRING} =~ m#(?:https?://)?(?:[^@\n]+@)?(?:www\.)?(?<NEW_HOST>[^:/\n]+)#">
   RequestHeader set Host %{MATCH_NEW_HOST}e
</If>

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