web-dev-qa-db-ja.com

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]

最初に変数を動的に設定する必要がありますか?

2
George

解決策は次のとおりでした

この正規表現により、ホストのドメインだけでなくクエリ文字列全体を取得できます。 %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>
1
George

次のステートメントがあります。

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

RequestHeader ディレクティブを見ると、次のように書かれています。

setappendmergeおよびaddの場合、3番目の引数として値が指定されます。

したがって、パターンは実際に値と見なされています。代わりに、あなたがすべきことは

  1. <If>ディレクティブを使用して、リクエストがp12?url=に対するものかどうかを確認します
  2. <if>句内のSetEnvIfディレクティブを使用して、一部のカスタム環境変数を最後に必要な値に動的に設定します(それがmy_new_Hostであると仮定しましょう)。
  3. 3番目の引数として%{my_new_Host}eを使用してRequestHeaderステートメントを追加します。

以下を試してください:

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