index.php にフォールバックする場所内に catch-all を設定する

index.php にフォールバックする場所内に catch-all を設定する

私は nginx の設定に苦労しています。 (またはなど)が存在しない限り、serverすべてのリクエストを に送信するブロックがあります。index.php?tags=$uri$uriindex.php?a=b/?a=b

私は次のように予想します:

try_files $uri index.php?tags=$uri;

しかし、それは単純すぎるでしょう。それは には機能しません。/?a=bどうやら は見つからないので、 に誘導されます。index.php?tags=/

おそらく、 を明示的に含めればindex、それは合理的です:

index index.php;

いいえ。ダメです。全体的にまったく同じ結果です。

また$args、、$request_uriまたは組み合わせも使用できません。また、以下も使用できません:

try_files $request_uri/index.php $request_uri index.php?tags=$request_uri; // now I'm just guessing

redirectApache はどういうわけか、私が何を意味しているかを常に理解していました。なぜ nginx は理解しないのでしょうか? 次のリダイレクト (またはなしif)を希望します:

/   => /index.php
/index.php   => /index.php
/index.php?a=b   => /index.php?a=b
/?a=b   => /index.php?a=b
/foo   => /index.php?tags=foo (or /index.php?tags=/foo)
/foo/bar   => /index.php?tags=foo/bar (or /index.php?tags=/foo/bar)
/foo?bar=yes   => /index.php?tags=/foo%3Fbar%3Dyes

リダイレクト時にクエリ文字列をエンコードしたいのですが、パスはエンコードしたくありません。しかし、実際にはそれはそれほど重要ではありません。

($uri と $request_uri の実際の違いもわかりません。半分は同じことをしているようです。しかし、それはまた別の日に。)

本当にありがとう。

答え1

次の構成スニペットで希望する結果を達成しています。

location = / {
    index index.php;
}

location / {
    try_files $uri /index.php?tags=$request_uri;
}

try_files試行... ファイル。/これを使用してシークすると、同じ名前のファイルを検索しますが、「インデックス ファイルを見つける」とは解釈されません。indexその作業を行います。したがって、この特別なケースをデフォルトのフォールバック場所から分離する必要があります。

最も良い部分は、最後の希望です。引数は必要がないためエンコードされません (URI の最初の疑問符のみが関連し、その後のすべてが引数であるため)。

使用上の注意$request_uri(要求されたURIと引数を含むが、正規化/クリーンアップは行われない)正規化された$uri(URI をクリーンアップし、引数を削除します)。その結果、次のようになります。

///foo?bar=yes => index.php?tags=///foo?bar=yes

気になる場合は、$uriと組み合わせて$args:

location = / {
    index index.php;
}

location / {
    try_files $uri /index.php?tags=$uri?$args;
}

制作:

///foo?bar=yes => index.php?tags=/foo?bar=yes

関連情報