Por que o nginx não envia o cabeçalho Content-Length quando a solicitação é HEAD?

2

Estou usando o CURL para testar solicitações HEAD no meu servidor nginx. O arquivo que está sendo servido é um simples arquivo PHP .

Se eu usar GET :

$ curl -XGET http://test.com/phpinfo.php -I
HTTP/1.1 200 OK
Date: Tue, 09 Apr 2013 00:35:35 GMT
Content-Type: text/html
Connection: keep-alive
Content-Length: 72080

No entanto, se eu usar HEAD :

$ curl -XHEAD http://test.com/phpinfo.php -I
HTTP/1.1 200 OK
Date: Tue, 09 Apr 2013 00:37:00 GMT
Content-Type: text/html
Connection: keep-alive

Por que, se a solicitação for HEAD , nginx omite o cabeçalho Content-Length ? O script php é muito simples e não está respondendo a HEAD de maneira especial.

Existe alguma opção que eu possa ativar no nginx, para que ele também envie o Content-Length para HEAD ?

Informações relevantes do nginx:

nginx version: nginx/1.2.8
built by gcc 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1) 
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx-1.2.8 --with-http_ssl_module --with-http_realip_module --with-http_gzip_static_module --with-pcre --conf-path=/etc/nginx/nginx.conf --add-module=../headers-more-nginx-module-0.19rc1

Configuração:

user  www-user;
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include mime.types;
    default_type  application/octet-stream;
    client_max_body_size 10M;

    sendfile        on;
    keepalive_timeout  65;

    more_clear_headers "Server";

    gzip  on;
    gzip_types text/plain text/css application/json application/javascript application/x-javascript text/javascript text/xml application/xml application/rss+xml application/atom+xml application/rdf+xml;

    server {
        server_name test.com;
        root   /www;
        index index.php index.html index.htm;

        listen       80  default_server;

        rewrite ^/(.*)/$ /$1 permanent; #remove trailing slash

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        include      general/*.conf;

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        location ~ \.php$ {

    fastcgi_intercept_errors on;

    fastcgi_pass   unix:/run/php/php-fpm.sock;

    fastcgi_index index.php;

    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

    include        fastcgi_params;

        }
    }
}
    
por F21 09.04.2013 / 02:39

1 resposta

1

Um motivo pelo qual nginx provavelmente não inclui o cabeçalho de resposta Content-Length para uma solicitação HEAD HTTP é que por definição , a resposta a uma solicitação HEAD não deve conter um corpo de mensagem na resposta (consulte RFC 2616 para mais detalhes).

Agora, um servidor HTTP poderia enviar Content-Length: 0 para respostas a HEAD solicitações, mas são informações adicionais sobre o fio que não são necessariamente necessárias. Suspeito, então, que nginx está simplesmente omitindo um cabeçalho de resposta redundante, ao não incluir o cabeçalho Content-Length na resposta às suas solicitações HEAD .

Espero que isso ajude!

    
por 15.02.2016 / 22:54