書き換えルールを機能させようとしていますが、URLが疑問符で始まる場合、Nginxは期待どおりに404エラーを返さないことがわかりました。代わりに、rootディレクティブで定義されているindex.htmlが、「?」で始まるすべてのURLに提供されます。 (例:example.com/?page-does-not-exist
はホームページでは機能しますが、機能しないはずです)
これにより、example.com/?format=feed&type=rss
-> example.com/rss.xml
が機能している状態からリダイレクトを取得できなくなります。これは、JoomlaからJekyllに移行されたブログ用です。
簡単に言うと、example.com/123は404を返しますにアクセスし、example.com/?123はにアクセスしません。後者は、URL example.com?/123でサイトのホームページを返します。 (ファイルまたはフォルダー「123」がないため、要求は常に失敗するはずです。)
疑問符で始まるURLでは予想される404リダイレクトが発生しないことを除いて、HTTPSリダイレクトを含め、すべてがサイトで完全に機能します。これを修正するにはどうすればよいですか?
これが私の設定です:
server {
server_name example.com;
root /var/www/example.com;
index index.html;
listen 443;
ssl on;
...
rewrite "/?format=feed&type=rss" https://example.com/rss.xml permanent;
location ~* \.(?:ico|css|js|gif|jpeg|jpg|png|txt|svg|eot|woff|ttf)$ {
expires max;
add_header Pragma public;
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
add_header Access-Control-Allow-Origin *;
valid_referers none blocked example.com;
if ($invalid_referer) {
return 403;
}
}
}
# HTTP --> HTTPS
server {
listen 80;
server_name www.example.com example.com;
return 301 https://example.com$request_uri;
}
疑問符は、URIのパス部分の終わりとクエリ文字列の始まりを示します。したがって、なぜnginxは疑問符の後の部分に基づいて404を返さないのですか?要求されたリソースは存在し、クエリ文字列パラメータはそのリソースに渡されます。
質問の他の部分に関しては、nginxの書き換えステートメントは実際にはURIのクエリ文字列部分と一致しないと思います。
ただし、次の行に沿って何かを実行できるはずです。
if ($args ~ "format=feed&type=rss") {
rewrite ^ https://example.com/rss.xml? permanent;
}
NGinx
は、?
に続くすべてのものを、パスではなくクエリ文字列として解釈します。
クエリ文字列ではなく、存在しないパスに対してのみ404を返します。
例:
example.com/123
:パス/123
が存在し、このパスのインデックスファイルがある場合は問題ありません。それ以外の場合は、404が返されます。
example.com/?123
:ルートディレクトリにexample.com
のインデックスファイルがある場合は、問題ありません。ディレクトリ?123
はパスではなくクエリ文字列と見なされるため、存在するかどうかはチェックされません。