NGINX 301 e 302 que servem um pequeno corpo do documento nginx. Qualquer maneira de remover esse comportamento?

5

Percebemos que, ao usar o manuseio interno de n1x1301 e 302, o nginx servirá um corpo de documento pequeno com o cabeçalho apropriado Location: ...

Algo ao longo das linhas de (em html): 301 redirect - nginx.

Conforme apropriado no comportamento acima, também é enviado um cabeçalho text-type text / html e content-length.

Fazemos muitos redirecionamentos 302 e 301, o comportamento acima é desperdício de largura de banda em nossa opinião.

Qualquer maneira de desabilitar esse comportamento?

Uma ideia que nos veio à mente foi configurar error_page 301 302 para um arquivo de texto vazio. Nós não testamos isso ainda, mas estou assumindo que, mesmo com o acima, os cabeçalhos content-type e content-length (0) serão enviados.

Existe uma maneira limpa de enviar um redirecionamento 301/302 "sem corpo" com o nginx?

    
por anonymous-one 28.08.2012 / 14:57

3 respostas

9

Pense com muito cuidado sobre o que você está pedindo e considere não fazer isso .

A RFC 2616 especifica que os órgãos da entidade que você deseja remover devem estar presentes.

10.3.2 301 Moved Permanently

The new permanent URI SHOULD be given by the Location field in the response. Unless the request method was HEAD, the entity of the response SHOULD contain a short hypertext note with a hyperlink to the new URI(s).

e ...

10.3.3 302 Found

The temporary URI SHOULD be given by the Location field in the response. Unless the request method was HEAD, the entity of the response SHOULD contain a short hypertext note with a hyperlink to the new URI(s).

DEVEM, neste contexto, ser definido em RFC 2119 :

This word, or the adjective "RECOMMENDED", mean that there may exist valid reasons in particular circumstances to ignore a particular item, but the full implications must be understood and carefully weighed before choosing a different course.

Agora você pode fazer isso sem violar a RFC, mas deve estar ciente das implicações completas:

  • Você está fazendo muito trabalho praticamente sem nenhum benefício. A única razão lógica que posso pensar em desabilitar o corpo da entidade é economizar nos custos de largura de banda, e de fato essa é a razão pela qual você mencionou, mas a diferença é tão pequena que é improvável que você veja uma diferença em seus gráficos de largura de banda.
  • Uma fração muito pequena de clientes da web não segue automaticamente os redirecionamentos 3xx. Essa fração foi muito maior quando o RFC foi escrito, e é por isso que ele está lá, mas ainda há monstruosidades antigas à espreita nas sombras de quartos escuros e armários de data centers, e às vezes eles saem para brincar. O que você provavelmente verá é curl , que ainda está em uso comum.

Esta recomendação foi um pouco relaxada com RFC 7231 , que diz apenas (para ambos 301 e 302):

The server's response payload usually contains a short hypertext note with a hyperlink to the new URI(s).

The server's response payload usually contains a short hypertext note with a hyperlink to the different URI(s).

    
por 02.09.2012 / 19:37
4

Sim, você pode ABSOLUTAMENTE fazer isso com o NGINX!

  • Basta instalar um manipulador de exceções, a.k.a. error_page , para processar as respostas necessárias. Certifique-se de configurá-lo de modo a evitar que a página de erro modifique o Código de Status HTTP, por exemplo, não use o parâmetro = (ou use-o para codificar o código desejado).

  • Certifique-se de return uma resposta com um código de status de retorno que permite que você defina opcionalmente o [text] , não o URL .

  • Especifique default_type de "" , que parece remover o Content-Type header

Aqui está o código completo, também no meu GitHub em StackOverflow.cnst.nginx.conf repositório:

# cat sf.421976.301-302-redirect-w-no-http-body-text.nginx.conf | sed 's#^#\t#g'
server {
    listen 1976;
    error_page 301 302 @30x; # keep original HTTP status code w/o '='
    location @30x {
        default_type ""; # will remove Content-Type completely
        # '300' is a filler: client will get the original HTTP status code
        return 300;
    }
    return 301 http://example.su/test;
}

Esta é a confirmação de que está funcionando corretamente:

% curl -i localhost:1976 | sed 's#^#\t#g'
HTTP/1.1 301 Moved Permanently
Server: nginx/1.2.1
Date: Mon, 28 Aug 2017 22:02:41 GMT
Content-Length: 0
Connection: keep-alive
Location: http://example.su/test

%

Eu tentei nos navegadores, e funcionou bem lá também.

P.S. Outra opção seria modificar o código-fonte e editar as variáveis ngx_http_error_301_page et al, mas por que vai o caminho difícil ?! ^ _ ^

    
por 28.08.2017 / 23:44
0

É um pouco feio, mas talvez você possa fazer proxy nas solicitações 301/302 e usar o proxy_method para alterar as solicitações GET para HEAD. Eu não testei isso, mas as solicitações de cabeçalho devem enviar somente cabeçalhos sem respostas ou cabeçalhos de conteúdo (esperançosamente).

link

    
por 02.09.2012 / 17:15