저는 이 질문과 정확히 동일한 오류를 겪고 있습니다. 즉, 설정에서 허용한 후 js 파일을 업로드할 수는 있지만, 다운로드를 시도하면 브라우저의 URL이 js 파일 URL로 바뀌고 "The change you wanted was rejected."라는 메시지가 표시됩니다.
환경:
Nginx 뒤에 실행 중인 Discourse Docker (Nginx가 SSL 사용)
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'
Nginx 로그:
10.164.0.103 - - [22/Feb/2021:05:51:11 +0000] "GET /uploads/short-url/p5ePkm5OoKveknnMjyArlS4PPwS.js HTTP/2.0" 422 781 "getting-started-with-sftp-module/292" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36"
``
도움이나 조언을 부탁드립니다!
지금 우리는 코드를 게시물의 텍스트 섹션에 복사하여 붙여넣고 있습니다.
사용 사례: 반복적으로 발생하는 문제의 해결책이나 키스터리터(Kickstarter) 코드가 담긴 .js 파일을 가지고 있으며, 이를 첨부파일로 공유하여 사용자가 다운로드한 후 자신의 프로젝트에서 바로 사용하게 하고 싶습니다.
그러나 파일 확장자를 .js에서 .txt로 변경하면 다시 "원하시는 변경이 거부되었습니다."라는 오류가 발생합니다. (이는 백엔드의 저장 최적화 기능 때문일 수 있으며, 파일 내용이 이전 파일과 동일하면 새 첨부파일이 이전에 업로드된 파일을 가리키도록 하는 것입니다.)
그래서 .txt 확장자의 js 파일 내용을 조금 수정하고 다시 업로드했는데, 첨부파일로 다운로드하는 데 성공했습니다.
S3 업로드에서는 작동하며 로컬 업로드에서도 작동해야 하지만, Rails에서 새로운(혹은 비교적 새로운) 보안 조치가 있는 것 같습니다:
ActionController::InvalidCrossOriginRequest (보안 경고: 다른 사이트의 임베디드 태그가 보호된 JavaScript를 요청했습니다. 무엇을 하는지 정확히 알고 있다면, 이 액션에서 위조 보호를 비활성화하여 크로스 오리진 JavaScript 임베딩을 허용할 수 있습니다.)
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)
저희도 같은 문제가 있습니다. 저희 소프트웨어에서 실행되는 js 파일들이 있는데, 브라우저에서 어떤 동작을 할 수 있는 파일들은 아닙니다.
모든 업로드 파일을 S3 버킷으로 이동하고 s3_use_cdn_url_for_all_uploads를 true로 설정함으로써 Discourse 다운로드 문제를 해결했습니다. 이는 js 파일의 치명적인 장애 요인으로 보이는 short-url 컨트롤러를 우회하는 효과가 있습니다.
상세 내용(AI가 안내해 준 내용을 바탕으로 정리):n
S3 호환 스토리지 설정 (예: Cloudflare R2)
Discourse는 로컬 디스크에서 .js 파일을 안전하게 서빙할 수 없습니다. 파일을 버킷으로 이동해야 합니다.
버킷: 비공개 버킷(예: my-discourse-bucket)을 생성합니다.
API 키: 액세스 키(Access Key)와 시크릿 키(Secret Key)를 생성합니다.
2. 커스텀 CDN 도메인 구성
Cloudflare(또는 해당 프로바이더)에서 버킷에 커스텀 도메인(예: cdn.example.com)을 연결합니다. 이를 통해 파일이 직접적인 URL을 통해 정적 자산으로 서빙되어 Discourse의 '보안 가드’를 우회하게 됩니다.
3. Discourse 설정 업데이트
관리자 → 설정에서 S3 세부 정보를 구성합니다. 중요하게는, 임시 헤더로 인해 깨질 수 있는 URL에 '서명’을 시도하지 않도록 하기 위해 다음 항목을 활성화해야 합니다:
s3_use_cdn_url_for_all_uploads: 이 상자를 선택하세요 (가장 중요한 단계입니다).
s3_cdn_url: https://cdn.example.com으로 설정합니다.
s3_region: R2 호환성을 위해 us-east-1을 사용합니다.
4. 기존 업로드 마이그레이션 (선택 사항)
참고: 저희는 알 수 없는 이유로 이 단계가 작동하지 않았습니다.
기존 게시물에 있는 오래된 링크를 수정하려면 컨테이너에 진입하여 다음을 실행하세요:
Bash
# /var/discourse 내부에서
./launcher enter app
rake uploads:migrate_to_s3
rake posts:rebake