私は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を確認すると、書き換え条件がtrueの場合は%1をプロキシし、新しいHost env変数を設定します。
RewriteRule ^.*/p12$ %1 [P,NC,L,E=new_Host:%2]
New_Host環境変数が存在するかどうかを確認する必要があります。それ以外の場合は、ホストをnullに設定します。
<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
の場合、3番目の引数として値が指定されます。
したがって、パターンは実際に値と見なされています。代わりに、あなたがすべきことは
<If>
ディレクティブを使用して、リクエストがp12?url=
に対するものかどうかを確認します<if>
句内のSetEnvIf
ディレクティブを使用して、一部のカスタム環境変数を最後に必要な値に動的に設定します(それがmy_new_Host
であると仮定しましょう)。%{my_new_Host}e
を使用してRequestHeader
ステートメントを追加します。以下を試してください:
<If "%{QUERY_STRING} =~ m#(?:https?://)?(?:[^@\n]+@)?(?:www\.)?(?<NEW_Host>[^:/\n]+)#">
RequestHeader set Host %{MATCH_NEW_Host}e
</If>