Sto riscontrando esattamente lo stesso errore di questa domanda, ovvero: riesco a caricare file JS dopo averli abilitati nelle impostazioni, ma quando provo a scaricarli, l’URL nel browser cambia in quello del file JS e viene visualizzato il messaggio “La modifica desiderata è stata rifiutata”.
Ambiente:
Discourse Docker in esecuzione dietro Nginx (Nginx utilizza SSL)
Log del 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'
Stai permettendo l’aggiunta di file *.js ai post da parte degli utenti? Hai una reale necessità che gli utenti allegino file JavaScript? Voglio solo confermare con certezza prima di procedere oltre.
Grazie per la risposta rapida!
Sì, si tratta di una discussione Q/A sulla programmazione, quindi allegare file di codice *.js è un caso d’uso legittimo.
Ciao a tutti! Sto riscontrando lo stesso problema. Abbiamo consentito il caricamento di file con estensione .js, ma nessuno riesce a scaricarli. Non abbiamo ancora trovato alcuna impostazione per risolvere il problema. Qualcuno può aiutare?
Per ora, copiamo e incolliamo il codice nella sezione testuale del post.
Caso d’uso: abbiamo un file .js contenente un codice di Kickstarter o una soluzione a un problema ricorrente e vogliamo condividerlo come allegato, in modo che gli utenti possano scaricarlo e iniziare a utilizzarlo nei loro progetti.
Tuttavia, se cambiamo l’estensione del file da .js a .txt, compare di nuovo il messaggio “La modifica desiderata è stata rifiutata.” (Questo potrebbe essere dovuto a un’ottimizzazione dello storage sul backend: se il file ha lo stesso contenuto di un file precedente, il nuovo allegato punta al file già caricato).
Quindi, ho modificato leggermente il contenuto del file con estensione .txt (che in origine era .js) e l’ho ricaricato; sono riuscito a scaricare il file come allegato.
@codinghorror Esiste un rischio di sicurezza nel permettere il download di file .js?
Funziona per i caricamenti su S3 e dovrebbe funzionare anche per i caricamenti locali, ma sembra esserci una nuova misura di sicurezza (relativamente recente) di Rails:
ActionController::InvalidCrossOriginRequest (Avviso di sicurezza: un tag incorporato in un altro sito ha richiesto JavaScript protetto. Se sai cosa stai facendo, procedi e disabilita la protezione contro la falsificazione in questa azione per consentire l’incorporamento di JavaScript cross-origin.)
Mi sono imbattuto nello stesso problema, abbiamo un forum di domande e risposte di codifica e dobbiamo essere in grado di condividere grandi file js per il 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)
i file js sono nell’elenco delle estensioni di caricamento consentite:
Stesso problema anche per noi. Abbiamo file js che vengono eseguiti nel nostro software, nulla che possa mai fare qualcosa in un browser.
Siamo riusciti a risolvere il problema di download di Discourse spostando tutti i caricamenti su un bucket S3 e impostando s3_use_cdn_url_for_all_uploads su true. Questo aggira essenzialmente il controller short-url che sembra essere l’ostacolo principale per i file js.
Nel dettaglio (dal mio AI che mi ha guidato in questo):
Configurare l’archiviazione compatibile con S3 (ad esempio Cloudflare R2)
Discourse non può servire in modo sicuro i file .js dal disco locale. Spostali in un bucket.
Bucket: Crea un bucket privato (ad esempio my-discourse-bucket).
Chiavi API: Genera una Access Key e una Secret Key.
2. Configurare un dominio CDN personalizzato
In Cloudflare (o nel tuo provider), collega un dominio personalizzato al tuo bucket (ad esempio cdn.example.com). Questo garantisce che i file vengano serviti come risorse statiche tramite un URL diretto, aggirando la “sentinella di sicurezza” di Discourse.
3. Aggiornare le impostazioni di Discourse
In Admin → Settings, configura i dettagli S3. Crucialmente, abilita quanto segue per assicurarti che Discourse non tenti di “firmare” gli URL con intestazioni temporanee che potrebbero rompere il funzionamento:
s3_use_cdn_url_for_all_uploads: Spunta questa casella (Questo è il passaggio più importante).
s3_cdn_url: Imposta su https://cdn.example.com.
s3_region: Usa us-east-1 (per compatibilità con R2).
4. Migrare i caricamenti esistenti (opzionale)
Nota: Questo NON ha funzionato per noi per motivi sconosciuti.
Per correggere i vecchi link nei post esistenti, entra nel tuo container ed esegui:
Bash
# Dentro /var/discourse
./launcher enter app
rake uploads:migrate_to_s3
rake posts:rebake