NGINX リダイレクト ルールはパスをクエリ文字列に変換します。

NGINX リダイレクト ルールはパスをクエリ文字列に変換します。

既存の Apache ルールを使用して URL を書き換えるために Helicon APE で実行されていた既存の IIS アプリが 1 つあります。次に例を示します。

RewriteRule ^/webapp/([^/]*)/([^/]*)(/.+)? /webapp/$4?$2=$3 [NC,L,P,QSA]

これらのルールでは、 のような元の URL/webapp/f6/3/gx/1/default.htmは に変換されます/default.htm?f6=3&gx=1。これにより、APE 内の可変数の中間パスがサポートされます (Apache でもサポートされるようです)。

APE はスケーリングがうまくいかず、負荷がかかるとクラッシュするため、書き換えを行い、バックグランドで IIS サーバーの負荷分散を実行する NGINX の設定を開始しました。

しかし、私が見つけた 1 つの問題は、nginx の書き換えの同じルールが同じようには機能しないということです。一致するように変換する必要がありました。

rewrite ^/webapp/(.*)/([^/]+).htm /webapp/$2?$1;

実際のところ、これは/webapp/f6/3/gx/1/default.htmリターンです/webapp/default.htm?f6/3/gx/1

/x/y/g/z私は、nginx でパス要素をクエリ文字列のペアに変換する方法を見つけようとしています?x=y&g=z。Apache は自動的にそれを行うようですが、nginx はそうしません。また、ドキュメントやこのサイトの他の質問、または StackOverflow でも何も見つかりません。

どうやら、マップを使用すればこれが実行できるようですが、具体的な使用法が見つかりません。また、私はこれを実行する nginx の専門家ではありません。どのような助言や指示でも歓迎します。

答え1

書き換えルールを正しく構築すると、パス要素がすべて消費されるまで、各反復で再帰的になり、クエリ パラメータが実行されます。

例えば:

rewrite ^(/webapp)/([^/]+)/([^/]+)(/.+)$ $1$4?$2=$3 redirect;

既存のクエリ文字列が自動的に追加されるためrewrite、上記のステートメントはリダイレクトごとにそれを拡張します。

rewrite...lastブロック内にステートメントを配置することで、内部リダイレクトで同じトリックを実現できますlocation

見るこのドキュメント多くのための。

関連情報