Pesquisei, mas não encontrei nenhum tópico sobre isso.
Quero desabilitar o download de links externos. Ou seja, não vou restringir o privilégio de download apenas aos usuários registrados; estou bem com que qualquer pessoa baixe os recursos do meu site Discourse, mas gostaria que eles, pelo menos, visitassem o site e visualizassem o tópico.
Atualmente, se houver algum arquivo carregado no Discourse, alguém pode simplesmente postar o link do arquivo em outro lugar e as pessoas podem baixá-lo sem nem saber que está vindo do meu site. Existe alguma maneira de conseguir isso?
Não, este é um cenário diferente: ele restringe qualquer usuário não logado de fazer o download. O que eu quero é impedir o download de um link para o recurso local a partir de outro site. Para as pessoas que visitam meu site, o download está disponível, seja elas registradas ou não.
Você só pode proteger ou não proteger a mídia. Se não estiver protegida, certamente qualquer pessoa poderá usar o link sem exibir sua interface de usuário? O navegador não se importa com quais páginas foram visitadas anteriormente.
Se os recursos forem valiosos, por que não protegê-los e distribuir o link para o tópico ao qual estão vinculados? Isso fornecerá um incentivo adicional para se registrar no seu site?
O navegador não se importa, mas o servidor pode. Por padrão, quando um navegador faz uma solicitação para a mesma origem da página que contém a referência, ele inclui um cabeçalho de referrer para informar ao servidor de onde veio. Um servidor pode usar essas informações para influenciar o comportamento, incluindo permitir ou negar acesso a determinados locais.
É fácil contornar isso, mas isso impede links casuais de outros sites.
Substituir www.example.com no código acima pelo domínio da sua instância do Discourse deve ser uma configuração nginx adequada para prevenir hotlinking dos uploads na sua instância.
Você também pode querer fazer algo diferente de retornar 403 (não permitido); por exemplo, talvez queira redirecionar para a página inicial do seu Discourse. Para fazer isso, você pode usar o seguinte código em vez disso.
Deve ser possível adicionar algo ao seu arquivo app.yml para injetar a configuração durante uma reconstrução. Quanto a essa parte, não tenho certeza de como fazer, pois não investiguei isso com muitos detalhes.
Obrigado por compartilhar, Simon. Isso pode ser a solução para as minhas necessidades, embora eu ainda não saiba como aplicá-lo com o Discourse. Conheço um pouco de servidor Linux e Apache, mas o Discourse usa Docker e Nginx, ambos fora do meu conhecimento. De qualquer forma, Simon nos indicou um caminho e vou investigar para ver se consigo fazer algo.
Acontece que a configuração que o Discourse usa para o nginx já inclui algo para hotlinking, embora esteja comentado. Então, o que você pode fazer é adicionar alguns comandos de substituição ao seu arquivo app.yml para descomentar essas linhas.
Edite /var/discourse/containers/app.yml com seu editor preferido. No final, você encontrará uma seção run e, no final dela, um comando exec que exibe “end of custom commands”.
Na primeira seção de substituição, você verá a linha to: com mysite.com *.mysite.com; substitua esses valores pelo seu próprio domínio, por exemplo, discourse.org *.discourse.org. A segunda substituição assume que você deseja que os visitantes sejam redirecionados para a página inicial do Discourse.
Após salvar as alterações, execute os seguintes comandos para reconstruir o Discourse com a configuração atualizada do nginx.