Por que o Nginx não retorna um erro 404 para URLs que começam com um ponto de interrogação?

2

Estou tentando fazer uma regra de regravação funcionar e descobri que, se a URL começar com um ponto de interrogação, o Nginx não retornará o erro 404 conforme o esperado. Em vez disso, index.html, conforme definido na diretiva raiz, é servido para todos os URLs que começam com "?". (por exemplo, example.com/?page-does-not-exist funciona para a página inicial, mas não deve)

Isso está tornando impossível obter um redirecionamento de example.com/?format=feed&type=rss - > example.com/rss.xml funcionando. Isso é para um blog migrado do Joomla para o Jekyll.

Simplificando, visitar example.com/123 retorna um 404 e visitar example.com/?123 não . O último retorna a página inicial do site no URL example.com ?/123. (Não há arquivo ou pasta '123', portanto, solicitações para ele devem sempre falhar.)

Tudo funciona perfeitamente com o site, incluindo o redirecionamento HTTPS, exceto pelo fato de os redirecionamentos 404 esperados não estarem ocorrendo para URLs que começam com um ponto de interrogação. Como faço para corrigir isso?

Aqui está minha configuração:

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;
}
    
por Tom Brossman 18.04.2014 / 23:51

2 respostas

3

O ponto de interrogação significa o final da porção do caminho do uri e o início da string de consulta. Portanto, por que nginx não retornará 404 com base na parte após o ponto de interrogação; o recurso solicitado existe e os parâmetros da string de consulta são passados para ele.

Em relação à outra parte da questão, acredito que a instrução de reescrita do nginx não corresponde realmente à porção da string de consulta do uri.

Você deve, no entanto, ser capaz de fazer algo nos moldes de:

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

NGinx interpreta tudo o que segue uma ? como uma string de consulta, não como um caminho.

Ele só retornará um 404 para um caminho não existente, não para uma string de consulta.

por exemplo:

  • example.com/123 : se o caminho /123 existir e se houver um arquivo de índice para esse caminho, tudo bem, senão ele retornará um 404

  • example.com/?123 : se houver um arquivo de índice no diretório raiz para example.com , tudo bem. Ele não verifica se o diretório ?123 existe, pois não considera isso como um caminho, mas como uma string de consulta.

por 19.04.2014 / 00:31