Erro Discourse_docker (blocked:csp) com svg-sprite ao usar subpastas

Sinta-se à vontade para acessar https://sales-community-staging.rainmakers.co/sales-community/ para ver o problema. Não há garantias de que estará disponível para sempre.
Acredito que isso ocorra porque não está adicionando /sales-community à URL.
Avise-me se fornecer o app.yml ou o nginx.conf seria útil.
Isso está na version: tests-passed.
Tentei version: stable para corrigir, mas não compila no Docker no momento (mencionado em outro relatório de bug que vi antes; eu estava começando do zero, não fazendo downgrade).

Alguém pode me dar a permissão para postar mais de uma imagem? :slight_smile:

1 curtida

Você seguiu o documento de instruções sobre subpastas?

Sim. Tudo o mais funciona (postagens, e-mails, upload de avatares, HTTPS, etc.). Todos os outros recursos têm URLs corretas na subpasta /sales-community (como mostrado na imagem). Apenas o SVG está quebrado.

# app.yml

coisas...

DISCOURSE_HOSTNAME: sales-community.rainmakers.co
DISCOURSE_RELATIVE_URL_ROOT: /sales-community

coisas...

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

Sim, então o problema não é com a CSP, porque a URL está simplesmente errada. Parece que ela não está sendo prefixada com o caminho da subpasta. Acredito que precise ser adicionada aqui?

4 curtidas

Hmm, isso é um bug de subpasta @eviltrout?

Temos toda a lógica implementada para sprites SVG em cenários de subpastas, e ela é usada com sucesso por vários sites. Neste caso, encontramos um caso de borda muito específico. Verificando as variáveis principais no site de @vkozyrev (no console do navegador):

> Discourse.SvgSpritePath
"/svg-sprite/sales-community-staging.rainmakers.co/svg-2-8ed106e6e3d908b1b86898dfe93a7bac0fd358f4.js"
> Discourse.BaseUri
"/sales-community"

Parece correto. Agora, ao carregar a folha de sprites SVG, usamos loadScript, que por sua vez chama Discourse.getURL. Essa função é responsável por adicionar o prefixo da subpasta. Testando isso:

> Discourse.getURL(Discourse.SvgSpritePath)
"/svg-sprite/sales-community-staging.rainmakers.co/svg-2-8ed106e6e3d908b1b86898dfe93a7bac0fd358f4.js"

Estranho… isso não fez nada. Outra URL aleatória funciona bem:

> Discourse.getURL("/blah")
"/sales-community/blah"

Um pouco mais de investigação revela esta linha dentro de getUrl:

if (url.indexOf(Discourse.BaseUri) !== -1) return url;

Ou, em português: “se a URL já contiver o prefixo da subpasta, desista”. Então, o problema aqui é que o prefixo da subpasta de @vkozyrev (/sales-community) está incluído no meio da URL da folha de sprites SVG:

/svg-sprite/sales-community-staging.rainmakers.co/svg-2-8ed106e6e3d908b1b86898dfe93a7bac0fd358f4.js

Fiz a verificação mais específica, para que ela verifique o prefixo da subpasta apenas no início da URL:

Embora isso me faça pensar em outros problemas potenciais… por exemplo, se alguém quisesse que o prefixo da subpasta fosse /t ou /about, ou qualquer outra URL que usamos no Discourse :thinking:

10 curtidas

@vkozyrev isso já foi mesclado, então por favor atualize seu site e nos avise se isso resolver o problema :slight_smile:

O problema foi resolvido @david.

Esse é um caso de borda incrível :smiley:. Eu faço desenvolvimento em Rails (apenas modo API), feliz por não ter ido muito fundo no coelho, senão teria me perdido no código do cliente.

Caso esteja curioso, tenho um proxy na frente disso, então o subdomínio sales-community fica oculto para os usuários; eles verão apenas /sales-community na frente da URL do nosso site principal. O site principal está no Heroku, então não posso ter uma única instância do nginx fazendo todo o roteamento.

Obrigado pelas respostas rápidas e pela correção, pessoal!

6 curtidas