
私は nginx の設定に苦労しています。 (またはなど)が存在しない限り、server
すべてのリクエストを に送信するブロックがあります。index.php?tags=$uri
$uri
index.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
redirect
Apache はどういうわけか、私が何を意味しているかを常に理解していました。なぜ 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
location = / {
index index.php;
}
location / {
try_files $uri /index.php?tags=$uri?$args;
}
制作:
///foo?bar=yes => index.php?tags=/foo?bar=yes