Alterações recentes quebrando configuração de subpasta?

Peço desculpas se eu diagnosticar isso incorretamente, mas recentemente enfrentei alguns problemas após uma atualização em uma configuração de subpasta que funcionava antes, então acho que pode ter havido um regression em algumas frentes recentemente? Em particular, estou hospedando o Discourse de forma independente usando a configuração de subpasta descrita aqui, que estava funcionando perfeitamente (AFAICT) até recentemente.

Atualmente, ao fazer login usando SSO ou ao alternar para/desdo modo anônimo (e talvez em outras situações que ainda não encontrei), sou redirecionado para https://my_machine/discourse_path_stuff, em vez de ser redirecionado para https://my_machine/forum/discourse_path_stuff. Também ocorre que, quando acesso https://my_machine/forum (o endpoint correto), minha barra de endereços é reescrita para mostrar https://my_machine (com a subpasta removida), embora a maioria dos links pareça resolver para os locais corretos.

Infelizmente, não me lembro em qual commit eu estava quando as coisas estavam funcionando, mas tenho certeza de que estava sob o guarda-chuva “2.4.0.beta10” e provavelmente dentro dos últimos ~10 dias. Atualmente estou rodando na versão bd49d4af1a.

Peço desculpas se estou apenas fazendo algo estúpido e estou feliz em ajudar a rastrear o problema se houver sugestões sobre onde devo procurar.

1 curtida

Você pode compartilhar a URL do site? Você está usando nosso protocolo SSO ou alguma estratégia OAuth2 / omniauth?

2 curtidas

Claro, está em https://py.mit.edu/forum (mas atualmente está bloqueado para visualização pública). https://py.mit.edu/forum/login demonstra o problema (embora eu tenha adicionado outra regra no NGINX especificamente para redirecionar 302 https://py.mit.edu/login de volta para https://py.mit.edu/forum/login assim que começamos a ver isso, o que tem sido uma solução alternativa para a parte do SSO, pelo menos).

Estamos usando o protocolo Discourse SSO, que definitivamente funcionava sem problemas antes. O handshake ainda parece ocorrer corretamente, apenas redirecionando para o lugar errado no final. A chave "return_sso_url" no payload do SSO está retornando corretamente ao nosso endpoint de SSO (com /forum).

Também tentei uma reconstrução, mas isso não parece ter resolvido o problema.

Infelizmente, isso pode ser difícil de depurar, pois não me sinto confortável em dar acesso a pessoas de fora, já que essa instância existe para uma aula, e não me sinto à vontade em compartilhar dados de estudantes com partes externas (mesmo que eu confie em você pessoalmente!). Mas, se ajudar, posso tentar replicar essa configuração em outro servidor ao qual eu possa conceder acesso a você…

3 curtidas

Vejo também que o link para entrar/sair do modo anônimo está usando window.location.reload() para recarregar a página após enviar uma solicitação a um endpoint para alternar para o modo anônimo. Assim, esse recarregamento certamente verá a URL reescrita (que não contém mais /forum), o que causaria isso (não tenho certeza se é uma história semelhante para os problemas de SSO).

Vou dar uma olhada nos conjuntos de alterações recentes para ver se a coisa que (acho que?) está reescrevendo window.location é uma adição recente.

Além disso, Discourse.getURL('/login') ainda me dá o resultado correto (com /forum).

1 curtida

Os caminhos são redefinidos sem o prefixo de subpasta na barra de endereços do navegador.

Exemplo:
Acesso example.com/forum → após o fórum carregar, a barra de endereços mostra example.com
Então, clico em “Mais recentes” → navego para a página mais recente e a barra de endereços mostra example.com/forum/latest
Atualizo a página no navegador, o site recarrega e a barra de endereços mostra example.com/latest
Quando atualizo novamente estando em example.com/latest, ocorre um erro 404 (porque meu nginx roteia apenas /forum para o Discourse).

A prévia do link no canto inferior esquerdo do navegador aparece como example.com/latest, example.com/new, etc. Atualizar um tópico também remove /forum da URL, mas depois ela volta a mudar, retornando para /forum/t/[…].

Eu estava na versão 2.4.0.beta2 anteriormente e não me lembro desse problema.

3 curtidas

Esta instalação foi criada seguindo o suporte a subpastas com Docker? Você pode fornecer um link para ela?

7 curtidas

Sim, eu também tentei em uma instalação local nova e obtive o mesmo problema:

app.yml

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"

expose:
 - 80:80

params:
  db_default_text_search_config: "pg_catalog.english"
  version: tests-passed

env:
  LANG: en_US.UTF-8
  UNICORN_WORKERS: 3
  DISCOURSE_RELATIVE_URL_ROOT: /forum
  DISCOURSE_HOSTNAME: localhost
  DISCOURSE_DEVELOPER_EMAILS: yyy

  DISCOURSE_SMTP_ADDRESS: yyy
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: yyy@yyy.yyy
  DISCOURSE_SMTP_PASSWORD: yyy
  DISCOURSE_SMTP_AUTHENTICATION: login

volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
            - git clone https://github.com/discourse/docker_manager.git

run:
    - exec:
        cd: $home
        cmd:
          - mkdir -p public/forum
          - cd public/forum && ln -s ../uploads && ln -s ../backups
    - replace:
       global: true
       filename: /etc/nginx/conf.d/discourse.conf
       from: proxy_pass http://discourse;
       to: |
          rewrite ^/(.*)$ /forum/$1 break;
          proxy_pass http://discourse;
    - replace:
       filename: /etc/nginx/conf.d/discourse.conf
       from: etag off;
       to: |
          etag off;
          location /forum {
             rewrite ^/forum/?(.*)$ /$1;
          }
5 curtidas

Consegui reproduzir o problema na minha instalação em subpasta. Vamos corrigir isso.

6 curtidas

Ótimo, obrigado! Feliz em saber que não estou louco.

No entanto, ao examinar os commits recentes, não consegui identificar um ponto óbvio onde essa reescrita está ocorrendo. Seria possível indicar onde no código isso acontece/acontecia? (Estou tentando me familiarizar com a base de código).

1 curtida

Seria! Só não sou a pessoa certa. Sou apenas “aquele cara” da equipe que, por acaso, tem uma instalação local em uma subpasta. Mas não sou engenheiro. O David deve conseguir te orientar na direção certa quando começar a trabalhar no problema mais tarde nesta semana.

6 curtidas

Quase certamente essa alteração que foi para esse problema. Não tenho certeza exatamente qual é o problema, mas vou investigar :eyes:

6 curtidas

Acontece que isso não tinha nada a ver com aquele commit. Encontrei a origem do problema, e uma correção já está em andamento:

12 curtidas

Excelente trabalho de detetive :man_detective:, @david :clap:

6 curtidas

Isso já foi mesclado - @hartz e @bokos, podem confirmar que o problema foi resolvido após uma atualização?

5 curtidas

Após um pouco de testes, as coisas realmente parecem estar funcionando novamente. Obrigado, @david!

2 curtidas