
Eu não consigo encontrarsuficientedocumentação. Eu tenho um aplicativo que gera algumas respostas dinâmicas, mas ainda pode se beneficiar do Last-Modified
cabeç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-Modified
cabeç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-Modified
cabeçalhos nas respostas do seu aplicativo é um começo, mas parece que você não lida If-Modified-Since
adequadamente com as solicitações recebidas porque seu aplicativo deveria responder 304 Not Modified
e 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_revalidate
usará o If-Modified-Since
cabeç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-Since
cabeç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.