web-dev-qa-db-ja.com

Nginxが疑問符で始まるURLに対して404エラーを返さないのはなぜですか?

書き換えルールを機能させようとしていますが、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;
}
2
Tom Brossman

疑問符は、URIのパス部分の終わりとクエリ文字列の始まりを示します。したがって、なぜnginxは疑問符の後の部分に基づいて404を返さないのですか?要求されたリソースは存在し、クエリ文字列パラメータはそのリソースに渡されます。

質問の他の部分に関しては、nginxの書き換えステートメントは実際にはURIのクエリ文字列部分と一致しないと思います。

ただし、次の行に沿って何かを実行できるはずです。

if ($args ~ "format=feed&type=rss") {
    rewrite ^ https://example.com/rss.xml? permanent;
}
3

NGinxは、?に続くすべてのものを、パスではなくクエリ文字列として解釈します。

クエリ文字列ではなく、存在しないパスに対してのみ404を返します。

例:

  • example.com/123:パス/123が存在し、このパスのインデックスファイルがある場合は問題ありません。それ以外の場合は、404が返されます。

  • example.com/?123:ルートディレクトリにexample.comのインデックスファイルがある場合は、問題ありません。ディレクトリ?123はパスではなくクエリ文字列と見なされるため、存在するかどうかはチェックされません。

1
user216707