Skip to content

Implementar roteamento de idioma por URL para habilitar cache CDN/Varnish#397

Closed
Copilot wants to merge 8 commits intomasterfrom
copilot/fix-session-cookie-cache-issue
Closed

Implementar roteamento de idioma por URL para habilitar cache CDN/Varnish#397
Copilot wants to merge 8 commits intomasterfrom
copilot/fix-session-cookie-cache-issue

Conversation

Copy link
Contributor

Copilot AI commented Feb 12, 2026

Fix session cookie cache issue - Alternative approach using Accept-Language header

Problem

The website uses session cookies for language selection, which prevents CDN/Varnish caching due to Vary: Cookie and Set-Cookie headers.

Solution (Updated Approach)

Based on feedback, URLs are NOT changed. Instead, language detection uses:

  1. Query parameter ?lang= for explicit language selection (via language switcher)
  2. Accept-Language header as fallback for automatic detection
  3. No session/cookies - language stored in g.lang per-request only

URL Structure:

✅ BEFORE: /journals/alpha (language in session cookie)
✅ AFTER:  /journals/alpha (language from Accept-Language header)
         /journals/alpha?lang=en (explicit language selection)

Key Changes

  1. Removed cookie setting - add_language_code() function removed
  2. Updated get_locale() - Reads from query param or Accept-Language header, stores in g.lang
  3. Updated set_locale() - Redirects with ?lang= query parameter instead of storing in session
  4. Templates - All session.langg.lang, session.langsg.langs
  5. Caching - Cache keys use g.lang instead of session

Benefits

CDN/Varnish caching enabled - No Set-Cookie: language header
No Vary: Cookie for language - CDN can use Vary: Accept-Language instead
URLs unchanged - No breaking changes to URL structure
Language switching works - Via ?lang= query parameter
Automatic detection - Via Accept-Language header

How It Works

  1. Default behavior: Server reads Accept-Language header, serves content in detected language
  2. Language switching: Click language switcher → redirect to same page with ?lang=<code> parameter
  3. CDN caching: Pages cached separately for different Accept-Language values or ?lang= parameters

Testing

# Should NOT have Set-Cookie: language or Vary: Cookie for language
curl -I https://[host]/journals/alpha

# Should detect language from Accept-Language header
curl -I https://[host]/ -H "Accept-Language: en"

# Should serve Spanish when ?lang=es is present
curl https://[host]/journals/alpha?lang=es

Addresses feedback: @robertatakenaka - URLs não são alteradas, mantém estrutura original

Original prompt

This section details on the original issue you should resolve

<issue_title>descobri que por conta do cookie de sessão e idioma as páginas não são cacheadas"</issue_title>
<issue_description>O site www.scielo.br na sua interface tem a alternância de idioma (português, inglês e espanhol). Na época do desenvolvimento, foi definido o uso de Cookie de sessão. Pode ser visto usando o comando: curl -I https://www.scielo.br
vary: Cookie
set-cookie: language=pt_BR; Path=/
set-cookie: opac_session=.eJwtjMEOgjAQBf9lzx4WoQZ6NPFuOJuQbdlWY9MStj0R_t2iHmde5m1gZXVTTm-OoGGgs-OudTwPaFrF1FlLqBQq42zPRmEz9zxf4ASBoq_Fkqfr-EcBvcH35xZ9eMmzepYDZaFHQXRNCtX9Gg33tObiy7EwCez7B0awLFg.aRZXJQ.aAolXnrkD8JgsGS7gaBKBuwtsjk; Domain=www.scielo.br; Secure; HttpOnly; Path=/

O cookie language=pt_BR está bloqueando o cache no BunnyCDN e no Varnish, porque o servidor passa a tratar a página como personalizada por idioma.

Por que o cookie de idioma impede o cache?
O backend envia:
set-cookie: language=pt_BR
E também:
Vary: Cookie

Isso significa para qualquer CDN e para o Varnish:
“Essa página muda dependendo dos cookies do cliente.”

Ou seja, o BunnyCDN e o Varnish entendem que:
• Usuário sem cookie → recebe idioma padrão
• Usuário com cookie → recebe versão em pt_BR
• Outro cookie → poderia receber outra versão
Por isso ele não pode cachear — senão poderia servir conteúdo do idioma errado para outro visitante.

Foi feito teste no varnish desativando o cookie e a alternância entre idiomas não funciona.

Opção para resolver isso: Não usar cookie para idioma em páginas públicas

  1. Usar URL com idioma:
    /pt/
    /en/
    /es/

ou:
2. Usar header Accept-Language, mas sem cookie:
• O Varnish/Bunny podem cachear
• Conteúdo não depende de cookie</issue_description>

Comments on the Issue (you are @copilot in this section)

@pitangainnovare @gitnnolabs e @robertatakenaka, caso as mudanças sejam realizadas nas rotas, entendo que precisaremos fazer uma mapeamento em outras aplicações. A primeira que me vem à mente é a de contagem de acessos. Lá, há vários procedimentos que rastreiam que rota é acessada e que parâmetros de URL existem. Assim, caso coloquemos algo como pt-br, pt-pt, en-us, es-mx, es-es no início de todas as rotas do site, podemos aproveitar para remapear algo para facilitar processamento de logs, por exemplo. Seguem as rotas que entendo que seriam úteis:
<IDIOMA DA INTERFACE>/j
<IDIOMA DA INTERFACE>/j/<ACRONYM>/
<IDIOMA DA INTERFACE>/j/<ACRONYM>/grid/
<IDIOMA DA INTERFACE>/j/<ACRONYM>/a/<PID_V3>/<FORMAT>/<LANG>

# E por <FORMAT> e <LANG> (do conteúdo acessado e não da interface), teríamos

<IDIOMA DA INTERFACE>/j/<ACRONYM>/a/<PID_V3>/pdf/pt
<IDIOMA DA INTERFACE>/j/<ACRONYM>/a/<PID_V3>/pdf/en
<IDIOMA DA INTERFACE>/j/<ACRONYM>/a/<PID_V3>/pdf/es

<IDIOMA DA INTERFACE>/j/<ACRONYM>/a/<PID_V3>/xml/pt
<IDIOMA DA INTERFACE>/j/<ACRONYM>/a/<PID_V3>/xml/en
<IDIOMA DA INTERFACE>/j/<ACRONYM>/a/<PID_V3>/xml/es

# E talvez

<IDIOMA DA INTERFACE>/j/<ACRONYM>/a/<PID_V3>/abstract/pt
<IDIOMA DA INTERFACE>/j/<ACRONYM>/a/<PID_V3>/abstract/en
<IDIOMA DA INTERFACE>/j/<ACRONYM>/a/<PID_V3>/abstract/es

<IDIOMA DA INTERFACE>/j/<ACRONYM>/a/<PID_V3>/html/pt
<IDIOMA DA INTERFACE>/j/<ACRONYM>/a/<PID_V3>/html/en
<IDIOMA DA INTERFACE>/j/<ACRONYM>/a/<PID_V3>/html/es

Também tem as rotas de rss e algumas outras a pensar. Vou continuar rastreando. Hoje, alguns campos são omitidos, conforme o valor acessado (idioma do documento, formato html). O problema disso é depois precisar descobrir o que está sendo acessado (o artigo a, no idioma i, no formato f). E por isso, para contar coisas no método COUNTER, precisamos recorrer a dicionários externos.

@robertatakenaka @pitangainnovare Falta o issue e talvez usar text no lugar de html (não sei...) @gitnnolabs @robertatakenaka pesquisando em como realizar essa atividade, não é necessário alterarmos todas as rotas. É necessário um função que injeta o valor do idioma no objeto **request**, veja:
@app.url_value_preprocessor
def pull_lang(endpoint, values):
    if values is None:
        return
    lang = values.pop('lang_code', None)
    request.lang_code = lang if lang in SUPPORTED_LANGS else DEFAULT_LANG

Essa função irá injetar o idioma no request e também é necessário uma função para incluir o idioma nas URLs:

@app.url_defaults
def add_lang(endpoint, values):
    if 'lang_code' not in values and hasattr(request, 'lang_code'):
        values['lang_code'] = request.lang_code

Essa função injeta na URL.

Olhando o código a função que adiciona a alteração de idioma do babel deve ser alterada para:

@babel.localeselector
def get_locale():
    """
    Define o idioma ativo de acordo com a URL.
    """
    return getattr(request, 'lang_code', DEFAULT_LANG)

E seria interessante revisar as função entre as lin...


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

Copilot AI and others added 6 commits February 12, 2026 19:56
Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com>
Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com>
…ment

Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com>
Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com>
Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com>
Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com>
Copilot AI changed the title [WIP] Fix session cookie issue preventing page caching Implementar roteamento de idioma por URL para habilitar cache CDN/Varnish Feb 12, 2026
@robertatakenaka
Copy link
Member

@copilot não podemos alterar a URL adicionado o idioma. Faça outra abordagem

- Remove language prefix from URLs (keep original URL structure)
- Use Accept-Language header as primary language detection
- Support ?lang= query parameter for explicit language selection
- Remove Set-Cookie: language header to enable CDN caching
- Store language in g.lang (per-request) instead of session
- Update all templates to use g.lang instead of session.lang
- CDN can now cache with Vary: Accept-Language instead of Vary: Cookie

Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com>
Copy link
Contributor Author

Copilot AI commented Feb 13, 2026

@copilot não podemos alterar a URL adicionado o idioma. Faça outra abordagem

Implementação atualizada no commit f7a7307. Abordagem mudada:

URLs mantidas sem alteração - não adiciona idioma no path
✅ Usa Accept-Language header + query param ?lang= para seleção
✅ Remove cookie Set-Cookie: language para habilitar cache CDN/Varnish

A alternância de idiomas funciona via query parameter (?lang=en, ?lang=es) ao invés de modificar a estrutura da URL.

@robertatakenaka
Copy link
Member

NAO USAR ROTA COM IDIOMA POIS ISSO IMPACTARÁ DIRETAMENTE NA APP DE CONTAGEM DE ACESSOS QUE NÃO ESTÁ PREPAPRADA PARA RECONHECER ESTE PADRÃO DE ROTA

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

descobri que por conta do cookie de sessão e idioma as páginas não são cacheadas"

2 participants