Apache-2.2
在 Apache mod rewrite 中動態設置 RequestHeader 主機
我正在使用 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
,merge
和add
一個值作為第三個參數給出。因此,您的模式實際上被視為價值。相反,你應該做的是
- 使用
<If>
指令查看您的請求是否適用於p12?url=
- 在子句中使用
SetEnvIf
指令<if>
將一些自定義環境變數動態設置為最後您想要的值(假設它是my_new_host
:)- 添加
RequestHeader
帶有 的語句%{my_new_host}e
作為其第三個參數。嘗試以下操作:
<If "%{QUERY_STRING} =~ m#(?:https?://)?(?:[^@\n]+@)?(?:www\.)?(?<NEW_HOST>[^:/\n]+)#"> RequestHeader set Host %{MATCH_NEW_HOST}e </If>