Estou recebendo exatamente o mesmo erro que esta pergunta, ou seja, consigo fazer upload de arquivos JS após permitir nas configurações, mas ao tentar baixar, a URL no navegador muda para a URL do arquivo JS e a mensagem “A alteração desejada foi rejeitada.” é exibida.
Ambiente:
Discourse em Docker rodando atrás do Nginx (o Nginx está usando SSL)
Logs do container Discourse:
Started GET "p5ePkm5OoKveknnMjyArlS4PPwS.js" for 192.168.32.1 at 2021-02-22 05:48:52 +0000
Processing by UploadsController#show_short as JS
Parameters: {"base62"=>"p5ePkm5OoKveknnMjyArlS4PPwS", "extension"=>"js"}
Sent file afcdf626f9db8d54a1fb5e8ebcab0ea214d9226a.js (2.2ms)
Security warning: an embedded <script> tag on another site requested protected JavaScript. If you know what you're doing, go ahead and disable forgery protection on this action to permit cross-origin JavaScript embedding.
Completed 422 Unprocessable Entity in 59ms (ActiveRecord: 0.0ms | Allocations: 17414)
ActionController::InvalidCrossOriginRequest (Security warning: an embedded <script> tag on another site requested protected JavaScript. If you know what you're doing, go ahead and disable forgery protection on this action to permit cross-origin JavaScript embedding.)
/opt/bitnami/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.3.1/lib/action_controller/metal/request_forgery_protection.rb:266:in `verify_same_origin_request'
Você está permitindo que arquivos *.js sejam anexados a posts pelos usuários? Você tem uma necessidade legítima para anexos de arquivos JavaScript por parte dos seus usuários? Apenas quero confirmar com certeza antes de prosseguirmos mais adiante.
Obrigado pela rápida resposta!
Sim, é uma discussão de perguntas e respostas sobre programação, então anexar arquivos de código *.js é um caso de uso legítimo.
Olá a todos! Estou com o mesmo problema. Permitimos o upload de arquivos com a extensão .js, mas ninguém consegue baixá-los. Ainda não encontramos nenhuma configuração para corrigir isso. Alguém pode ajudar?
Embora, agora nós copiamos e colamos o código na seção de texto da postagem.
Caso de uso: Temos um arquivo .js com um código do Kickstarter ou uma solução para um problema recorrente e queremos compartilhá-lo como um anexo, para que os usuários possam baixá-lo e começar a usá-lo em seus projetos.
No entanto, se mudarmos a extensão do arquivo de .js para .txt, ele novamente exibe “A alteração que você deseja foi rejeitada.” (Isso pode ser devido a alguma otimização de armazenamento no backend, onde, se o arquivo tiver o mesmo conteúdo de um arquivo anterior, o novo anexo apontará para o arquivo anteriormente enviado)
Então, alterei um pouco o conteúdo do arquivo .js (extensão .txt) e fiz o upload novamente, e consegui baixar o arquivo como anexo.
@codinghorror Existe algum risco de segurança ao permitir o download de arquivos .js?
Isso funciona para uploads no S3 e deveria funcionar também com uploads locais, mas parece haver uma medida de segurança nova (ou relativamente nova) do Rails:
ActionController::InvalidCrossOriginRequest (Aviso de segurança: uma tag incorporada em outro site solicitou JavaScript protegido. Se você sabe o que está fazendo, desabilite a proteção contra falsificação nesta ação para permitir a incorporação de JavaScript entre origens.)
Deparei-me com este mesmo problema, temos um fórum de perguntas e respostas de programação e precisamos ser capazes de compartilhar arquivos js grandes para download.
Started GET "/uploads/short-url/qDlrltMxEIJ2aYYdt8lZ200E3wA.js" for 94.31.111.247 at 2025-07-09 05:53:30 +0000
Processing by UploadsController#show_short as JS
Parameters: {"base62"=>"qDlrltMxEIJ2aYYdt8lZ200E3wA", "extension"=>"js"}
Sent file /var/www/discourse/public/uploads/default/original/1X/baab1fc131be960b601467333f5a690b257daeb0.js (0.3ms)
Security warning: an embedded <script> tag on another site requested protected JavaScript. If you know what you're doing, go ahead and disable forgery protection on this action to permit cross-origin JavaScript embedding.
Completed 422 Unprocessable Entity in 17ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms)
arquivos js estão na lista de extensões de upload permitidas:
Mesmo problema aqui. Temos arquivos JS que rodam em nosso próprio software, nada que faria algo em um navegador.
Conseguimos resolver o problema de download do Discourse movendo todos os uploads para um bucket S3 e definindo s3_use_cdn_url_for_all_uploads como true. Isso essencialmente contorna o controlador de URL curta, que parece ser o impeditivo para arquivos JS.
Em detalhes (do meu assistente de IA que me guiou nisso):
Configure o armazenamento compatível com S3 (por exemplo, Cloudflare R2)
O Discourse não pode servir com segurança arquivos .js a partir do disco local. Mova-os para um bucket.
Bucket: Crie um bucket privado (por exemplo, my-discourse-bucket).
Chaves de API: Gere uma Access Key e uma Secret Key.
2. Configure um domínio CDN personalizado
No Cloudflare (ou em seu provedor), conecte um domínio personalizado ao seu bucket (por exemplo, cdn.example.com). Isso garante que os arquivos sejam servidos como ativos estáticos por meio de uma URL direta, contornando o “guardião de segurança” do Discourse.
3. Atualize as configurações do Discourse
Em Admin → Configurações, configure seus detalhes do S3. Crucialmente, ative as seguintes opções para garantir que o Discourse não tente “assinar” as URLs com cabeçalhos temporários que podem quebrar:
s3_use_cdn_url_for_all_uploads: Marque esta caixa (Esta é a etapa mais importante).
s3_cdn_url: Defina como https://cdn.example.com.
s3_region: Use us-east-1 (para compatibilidade com R2).
4. Migre uploads existentes (opcional)
Nota: Isso NÃO funcionou para nós por motivos desconhecidos.
Para corrigir links antigos em postagens existentes, entre no seu contêiner e execute:
Bash
# Dentro de /var/discourse
./launcher enter app
rake uploads:migrate_to_s3
rake posts:rebake