Meu site Discourse tem muitas imagens. Devido às muitas imagens, uso uma combinação de S3/CDN para armazenar e servir imagens. Dentro da CDN, uso várias medidas para evitar o sequestro de imagens. Uma das medidas é impedir todo o acesso direto às imagens e permitir apenas o acesso a partir de uma lista de nomes de host definidos.
O Discourse funciona com essa configuração, exceto pelos Avatares. Os Avatares param de funcionar quando a proteção contra hotlinking está ativada.
O motivo é que o Discourse usa uma configuração de proxy para Avatares. O HTML usa um link de proxy para avatares. A estrutura do link é https://discourse.forum/user_avatar/discourse.forums/username/24/616_2.png.
Uma vez que o proxy é resolvido, o navegador solicita acesso direto ao arquivo de imagem.
Minha CDN impede o acesso direto com um 403 ao fazer essa solicitação direta. E todos os avatares personalizados se tornam silhuetas.
Que opções temos para remover o proxy?
Podemos alterar o avatar para uma estrutura de arquivo de imagem padrão?
Não tenho certeza se funciona dessa maneira. Dependendo da sua configuração, o proxy realmente faz o proxy ou a CDN vai primeiro. Você pode detalhar como isso está configurado?
Eu odeio perguntas vagas. O que você estava pensando quando pediu por “isso”?
Aqui estão minhas configurações atuais:
Configuração do Discourse:
Instalação padrão em um único contêiner
Configurado como um subdomínio: forums.domain.tld
Configuração padrão do S3 para uploads
Uploads são salvos no S3
Configuração do S3:
Digital Ocean S3 Bucket
Bucket ativado para acesso externo
Nenhuma outra camada de segurança ou permissões
Configuração do CDN:
bunny CDN
Referenciadores permitidos configurados: domain.tld e *.domain.tld
A opção que matou o acesso a avatares foi “Bloquear Acesso Direto a Arquivos por URL”.
Quando ativado, todos os avatares recebiam um erro 403. Quando desativado, os avatares apareciam.
Imagens não de Avatar:
URL no Discourse: https://cdn.domain.tld/optimized/3X/3/1/filename_#_size.jpeg
Imagens de Avatar:
URL no Discourse: https://forums.domain.tld/user_avatar/forums.domain.tld/mazzini/48/776_2.png
Uma postagem anterior, Como os avatares são armazenados e acessados?, indica que o Discourse usa um proxy para avatares. Portanto, a estrutura de URL para avatares não é uma estrutura de URL de imagem padrão.
Dentro do meu sistema, os avatares estão disponíveis no S3 ou no CDN. Isso indica que em algum lugar/de alguma forma o URL do avatar é convertido para um URL do CDN.
Quando isso acontece, o CDN considera o URL um link de acesso direto e bloqueia o acesso com um 403.
E eu odeio quando as pessoas respondem assim quando estou gastando meu tempo para ajudá-las, então isso nos deixa empatados .
Sim, e “proxy” significa que a solicitação passa pelo Discourse. A solicitação não é feita pelo navegador para o CDN, mas pelo Discourse.
Você configurou o CDN como um CDN de site completo ou como o CDN S3? Suspeito que o último. E nesse caso, a solicitação é feita pelo Discourse para o CDN, sem referenciador. Mas o CDN ainda pode reconhecer que é uma solicitação legítima porque a solicitação se origina do IP do Discourse. Daí meu conselho para adicioná-lo à lista de permissões.
Editar: você poderia verificar desativando a proteção por um curto período e olhando os logs no Bunny, e ver de quais IPs eles estão vindo.
Agradeço sua ajuda. Após décadas trabalhando em desenvolvimento e suporte de TI, perguntas e respostas vagas criam mais trabalho do que o necessário. Com base em sua experiência, acho que você concordaria.
A CDN está configurada apenas para o bucket S3.
Verifiquei os logs da CDN para o IP do Discourse relacionado aos erros 403 antes de enviar o tópico original. Ele não estava nos arquivos de log.
Com base em seus comentários, voltei e reanalisei os logs. Após revisar os maiores infratores de IP, descobri que os dois principais são gateways para a empresa de hospedagem.
O desafio é que não quero ficar rastreando os endereços IP de gateway da Digital Ocean para que meu servidor Discourse possa exibir imagens corretamente.