Como você invalida corretamente o cache local em um navegador?

2

Estou solucionando um problema no meu site em que um usuário autenticará com êxito, mas o navegador carregará (acredito) o cache local da página para a qual o usuário será redirecionado. Como é um cache local, a página aparece como se não estivessem conectadas. Depois de atualizar a página manualmente (usando o botão Atualizar no navegador), a página mostra como você fez o login.

Isso está acontecendo (intermitentemente) para eventos de login normais do Drupal, (frequentemente) para eventos de login do Facebook e (intermitentemente) para solicitações de páginas depois de ter efetuado login e carregamento de páginas. Eu reproduzi o erro no Firefox e no Chrome no Mac.

O site é executado no Drupal 7 e usa Varnish (hospedado no Pantheon ).

Exemplo de etapas de reprodução para ver o problema com o login do Facebook: 1. Seja desconectado do Facebook e meu site 2. Faça o login no meu site usando o botão de login do Facebook 3. Saia do meu site (usando o link de logout do site). Eu ainda estou logado no FB 4. Use o botão de login do FB no meu site para fazer o login

Eu esperava terminar na página inicial conectada. Em vez disso, sou redirecionado para a página inicial, mas uma versão em cache dele (então parece que não estou logado). Atualizar o navegador faz com que a página inicial seja recarregada e eu estou definido aqui.

Revisei os cabeçalhos (abaixo) das etapas de reprodução acima e, se bem entendi, acho que eles indicam que o navegador está carregando o cache local quando deveria fazer uma nova solicitação de página. Eu não sou especialista em cache, então pode ser um problema com os cabeçalhos ou qualquer outra coisa. Eu não tenho certeza de qual poderia ser a causa.

Aqui estão os cabeçalhos do botão inicial de login do FB. Como já estou logado no Facebook, sou redirecionado imediatamente para o meu site (isso é esperado).

Request URL:https://www.facebook.com/dialog/oauth?client_id=407390309287595&redirect_uri=http%3A//www.zujava.com/fboauth/connect&scope=email%2Cuser_about_me%2Cuser_website
Request Method:GET
Status Code:302 Found

Request Headers
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Cookie:c_user=3413203; csm=2; datr=bq8bT_JILi0PrW8H9GZ5BMy6; fr=0MYU2YYrkDuegxlUi.AWVgxOkdsHe9zhvPJdDW7h70n48; lu=RgWtdyxDRmUr6dOIqyRyPhtg; s=Aa45lsbBS4F1Oll2.BQBsO2; xs=67%3AuZMhOYBden1YIw%3A2%3A1342620598; p=5; act=1342620710713%2F3%3A0; presence=EM342620710EuserFA23413203A2EstateFDutF0EsndF1EnotF0Et2F_5b_5dEuct2F134262011B0Elm2FnullEtrFnullEtwF2196532340EatF1342620710745Esb2F0CEchFDp_5f3413203F1CC; locale=en_US
Host:www.facebook.com
Referer:http://www.zujava.com/user/login
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11
Query String Parametersview URL encoded
client_id:407390309287595
redirect_uri:http://www.zujava.com/fboauth/connect
scope:email,user_about_me,user_website

Response Headers
Cache-Control:private, no-cache, no-store, must-revalidate
Connection:keep-alive
Content-Length:0
Content-Type:text/html; charset=utf-8
Date:Wed, 18 Jul 2012 14:18:46 GMT
Expires:Sat, 01 Jan 2000 00:00:00 GMT
Location:http://www.zujava.com/fboauth/connect?code=AQBbeDeOf-cd6HCy6GALaDqESzcfgTJNmh_i5iIx2IpG-KOWBTJHcylhigo82ZGR_X2SOJVzkwcvIKa7rD4dxcg2CLLDa3eZJMkDlP6D3UIU6c-iCFu_TZg6LkfLM4cOGKtu5HraaQUrLUPJd96hOsmpDuW9lzTLuBeMH4fwI7m7p3Jybig1GE06098OJCGuGos#_=_
P3P:CP="Facebook does not have a P3P policy. Learn why here: http://fb.me/p3p"
Pragma:no-cache
Set-Cookie:locale=en_US; expires=Wed, 25-Jul-2012 14:18:46 GMT; path=/; domain=.facebook.com
X-Content-Type-Options:nosniff
X-FB-Debug:GPh2t018FPktnIalVO4RrxjZAQ3onlvvFyAEgI6g08U=
X-Frame-Options:DENY
X-XSS-Protection:0

Em seguida, estão os cabeçalhos que completam o login do FB no lado do meu site. Você pode ver o cookie de sessão sendo criado nos cabeçalhos de resposta:

Request URL:http://www.zujava.com/fboauth/connect?code=AQBbeDeOf-cd6HCy6GALaDqESzcfgTJNmh_i5iIx2IpG-KOWBTJHcylhigo82ZGR_X2SOJVzkwcvIKa7rD4dxcg2CLLDa3eZJMkDlP6D3UIU6c-iCFu_TZg6LkfLM4cOGKtu5HraaQUrLUPJd96hOsmpDuW9lzTLuBeMH4fwI7m7p3Jybig1GE06098OJCGuGos#_=_
Request Method:GET
Status Code:302 Moved Temporarily

Request Headers
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Cookie:ctools-collapsible-state=views-ui-advanced-column-petting_zu_graduates%3A1%2Cviews-ui-advanced-column-newly_published_content%3A1%2Cviews-ui-advanced-column-test%3A1%2Cviews-ui-advanced-column-html_sitemap%3A1; Drupal.tableDrag.showWeight=0; __atuvc=31%7C25%2C4%7C26%2C0%7C27%2C5%7C28%2C5%7C29; has_js=1; __utma=249598093.1349651830.1327187978.1342578105.1342618991.600; __utmb=249598093.64.9.1342621126771; __utmc=249598093; __utmz=249598093.1341848548.567.26.utmcsr=facebook.com|utmccn=(referral)|utmcmd=referral|utmcct=/l.php
Host:www.zujava.com
Referer:http://www.zujava.com/user/login
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11
Query String Parametersview URL encoded
code:AQBbeDeOf-cd6HCy6GALaDqESzcfgTJNmh_i5iIx2IpG-KOWBTJHcylhigo82ZGR_X2SOJVzkwcvIKa7rD4dxcg2CLLDa3eZJMkDlP6D3UIU6c-iCFu_TZg6LkfLM4cOGKtu5HraaQUrLUPJd96hOsmpDuW9lzTLuBeMH4fwI7m7p3Jybig1GE06098OJCGuGos
URL fragment
#:_=_

Response Headers
Age:0
Connection:keep-alive
Content-Length:0
Date:Wed, 18 Jul 2012 14:18:47 GMT
Location:http://www.zujava.com/
Via:1.1 varnish
X-Pantheon-Edge-Server:10.183.199.123
X-Varnish:181771624
cache-control:no-cache, must-revalidate, post-check=0, pre-check=0
content-type:text/html
etag:"1342621126"
expires:Sun, 19 Nov 1978 05:00:00 GMT
last-modified:Wed, 18 Jul 2012 14:18:46 +0000
server:nginx/1.0.15
set-cookie:SESS650d63be2a9c0113cd1740e78b8184ed=961WQoY1iwAJSjEBiuglfI_TDsz3VA8BReyLK2wnz44; expires=Fri, 10-Aug-2012 17:52:07 GMT; path=/; domain=.zujava.com; HttpOnly
x-drupal-cache:MISS

A solicitação final da página inicial:

Request URL:http://www.zujava.com/#_=_
Request Method:GET
Status Code:200 OK (from cache)
URL fragment
#:_=_

Acredito que isso indica que a home page está sendo carregada pelo cache do navegador local e que nenhuma solicitação está sendo feita no servidor. Se assim for, estou confuso sobre o porquê. Eu presumo que o problema estaria em como eu estou dizendo aos navegadores para armazenar em cache a página inicial?

Aqui estão os cabeçalhos de resposta de um carregamento de página desconectada da página inicial:

HTTP/1.1 200 OK
Server: nginx/1.0.15
Content-Type: text/html; charset=utf-8
Vary: Accept-Encoding
x-drupal-cache: HIT
Etag: "1342622308-0"
Content-Language: en
x-generator: Drupal 7 (http://drupal.org)
Cache-Control: public, max-age=10800
Last-Modified: Wed, 18 Jul 2012 14:38:28 +0000
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Content-Encoding: gzip
Content-Length: 8686
Date: Wed, 18 Jul 2012 14:50:55 GMT
X-Varnish: 658648930 658583362
Age: 295
Via: 1.1 varnish
Connection: keep-alive
X-Pantheon-Edge-Server: 10.183.199.163

Quaisquer sugestões ou ideias seriam bem-vindas.

    
por Justin 24.07.2012 / 17:17

1 resposta

1

O problema é que, como você já escreveu, a página inicial é marcada como armazenável em cache. Assim, quando um usuário efetua login e está sendo redirecionado para a página inicial, o navegador exibe a página inicial armazenada em cache. Você não pode invalidar o cache nesse ponto.

Você precisa tornar a página inicial não armazenável pelo navegador (ainda é possível armazená-la em cache para usuários anônimos) ou redirecionar os usuários conectados para uma página diferente, como: example.com/logged-in contém as mesmas informações da página inicial, mas não pode ser armazenada em cache.

A página inicial do cache-ing no navegador é uma má ideia, porque dessa forma você perderá informações estatísticas porque o navegador não faz nenhuma solicitação ao servidor.

    
por 01.09.2012 / 14:15