O Nginx `if_modified_since` funciona apenas em recursos estáticos?

O Nginx `if_modified_since` funciona apenas em recursos estáticos?

Eu não consigo encontrarsuficientedocumentação. Eu tenho um aplicativo que gera algumas respostas dinâmicas, mas ainda pode se beneficiar do Last-Modifiedcabeçalho – então eu o envio.

No entanto, ligar if_modified_since(definido como before, porhttp://nginx.org/en/docs/http/ngx_http_core_module.html#if_modified_since) não parece ter nenhum efeito em recursos não estáticos. Por exemplo, aplicativos php, python.

Isso ocorre porque o Nginx não está apenas olhando meu Last-Modifiedcabeçalho de resposta? Porque posso ver que eles parecem estar configurados corretamente, conforme abaixo:

> GET /3.0/view.json?id=2 HTTP/1.1
> Host: xxxxxxxxxxxxx
> Accept: */*
> If-Modified-Since: Sat, 02 May 2015 19:43:02 GMT
>
< HTTP/1.1 200 OK
* Server nginx/1.4.7 is not blacklisted
< Server: nginx/1.4.7
< Date: Fri, 01 May 2015 19:56:05 GMT
< Content-Type: application/json; charset=utf-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Vary: Accept-Encoding
< Last-Modified: Fri, 01 May 2015 19:56:05 GMT

Ou há algo maior que estou ignorando? Só estou curioso para saber como if_modified_sinceé implementado, em comparação com onde estou definindo minhas expectativas. Presumi que apenas examinaria os cabeçalhos de resposta e substituiria o status conforme necessário. Estou errado?

Responder1

Enviar Last-Modifiedcabeçalhos nas respostas do seu aplicativo é um começo, mas parece que você não lida If-Modified-Sinceadequadamente com as solicitações recebidas porque seu aplicativo deveria responder 304 Not Modifiede não 200 OK. Alterar a diretiva no nginx afeta apenas as solicitações atendidas diretamente pelo nginx, ou seja, recursos estáticos, a menos que você o configure como um cache de proxy reverso. Nesse caso, você poderá fornecer respostas desatualizadas em relação a esse valor de cabeçalho, pois o conteúdo será armazenado em cache por um período de tempo sem atingir seu aplicativo. A ativação <X>_cache_revalidateusará o If-Modified-Sincecabeçalho para revalidar o conteúdo do cache entre o cache do nginx e seu aplicativo assim que ele expirar (onde <X>= proxy/fastcgi/scgi/uwsgi)

Responder2

Como você não mencionou nada sobre a configuração do seu cache no Nginx, presumo que você não configurou um cache, e isso explicaria por que seu If-Modified-Sincecabeçalho não tem efeito para respostas dinâmicas.

Quando se trata de recursos estáticos, o Nginx tem uma maneira muito fácil de determinar como lidar If-Modified-Since: ele compara o horário no campo com o horário em que o arquivo foi modificado pela última vez. Não há problema aí.

Quando você deseja que o Nginx faça o mesmo com respostas geradas dinamicamente, não há nada para comparar,a menos que você ative o cache.Por padrão, o Nginx não se lembra das respostas que serviu. Quando você ativa o cache, o Nginx tem uma maneira de comparar uma solicitação recebida com uma resposta dada anteriormente e, portanto, tem uma maneira de usar arquivos If-Modified-Since.

encontreiEste artigorealmente útil para aprender os detalhes mais detalhados da configuração de um cache Nginx.

informação relacionada