(index):1 Access to script at 'https://cdnfoorumi.katiska.eu/assets/br/chunk-coedl1gv.digested.js' from origin 'https://foorumi.katiska.eu' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
prosemirror-editor-opfbo6zd.digested.js:1 GET https://cdnfoorumi.katiska.eu/assets/br/chunk-coedl1gv.digested.js net::ERR_FAILED 200 (OK)
d-editor.gjs:212 Uncaught (in promise) TypeError: Failed to fetch dynamically imported module: https://cdnfoorumi.katiska.eu/assets/br/prosemirror-editor-opfbo6zd.digested.js
Prosemirror는 RTEditor입니다. 하지만 제가 볼 수 있는 오류 메시지를 공유하는 것 이상으로는 더 이상 도움을 드릴 수 없습니다.
부수적인 이야기: “Kisses and animals”(키스와 동물) 카테고리에 대한 웃음 감사합니다. (불행히도 영어 번역에는 ‘cats’(고양이)라고 되어 있어서, 독일어 버전을 유지할게요 )
이 문제를 일으킬 만한 최근의 Discourse 변경 사항은 없다고 생각합니다. 하지만 S3에는 CORS와 관련된 오래된 특이한 문제가 있으며, 이로 인해 CDN이 Access-Control-Allow-Origin 헤더가 없는 자산 버전을 캐시할 수 있습니다. 그리고 이것이 잘못된 캐시 문제라면, 왜 일부 사용자(아마도 위치 기반일 가능성이 높습니다)에게만 영향을 미치는지 설명할 수 있습니다.
기억이 맞다면, S3는 Origin 헤더를 전송하는 요청(즉, 일반적인 웹 브라우저에서 오는 요청)에만 Access-Control-Allow-Origin 헤더를 제공합니다. Access-Control-Allow-Origin가 생략된 경우, 응답에 Vary: origin을 제공하지 않습니다. 따라서: 특정 자산에 대한 첫 번째 요청이 웹 브라우저가 아닌 컨텍스트(예: curl 또는 일부 웹 크롤러)에서 전송되면, CDN은 CORS 헤더가 없는 버전을 캐시할 수 있습니다. 정말 귀찮은 문제입니다!
여기서는 DISCOURSE_CORS 설정이 전혀 도움이 되지 않습니다. 그것은 S3가 아니라 애플리케이션 서버에만 관련이 있기 때문입니다.
우리의 호스팅에서는 Cloudfront를 구성하여 모든 응답에 Access-Control-Allow-Origin: *를 추가함으로써 이 문제를 우회합니다. 이렇게 하면 S3의 특이한 동작이 잘못된 결과가 캐시되는 것을 방지할 수 있습니다.
또는, Cloudfront를 구성하여 캐시 키에 Origin 요청 헤더를 포함하도록 할 수도 있습니다. 그러면 non-CORS 응답과 CORS 응답이 별도로 유지됩니다.
Amazon은 CORS에 대한 문서를 여기에 많이 제공하고 있습니다. 제 노트에는 정확히 이 문제에 대한 포럼 스레드였던 것으로 보이는 이 링크가 있었는데, Apparently 삭제된 것 같습니다
Ensimmäiseksi poistin web_only.yml-tiedostosta kaikki S3-viittaukset. Suoritin rebuildin ja varmuuden vuoksi myös rake posts:rebake-komennon. Ongelmat poistuivat, mutta kuvat tulivat edelleen CDN:n kautta. Palautin S3:n, ja ongelma palasi.
Avasin AWS-konsolin ja vilkaisin CloudFrontin distribution-asetukset. Siellä oli ainakin kolme vuotta vanha domain, jonka TLD oli muuttunut. Pidän ihmeellisenä, että mikään on ylipäätään toiminut. Muutin asetuksia CloudFrontin suositusten mukaiseksi ja johonkin kohtaan asetin myös access-control-allow-origin: * (joka on älytöntä, koska se tekee CORS:ista turhan). Tosin ymmärtääkseni tuo header oli kuitenkin jo tarjoiltu CloudFrontin kautta.
Varmuuden vuoksi taas rebuild ja testaaminen. Ei auttanut.
Koska on mahdollista, että cache kiukuttelee, invalidisoin /assets/* ja varmuuden vuoksi myös /assets/br/*. Taas rebuild, ja nyt ongelma korjaantui.
Korjaantui toinenkin ongelma. Minulla on ollut kesästä asti ongelmana Oops… eli virhe 50x rebuildin jälkeen. Kun avaan safe-moden ja disabloin teemat, pääsen adminiin. Minun täytyy disabloida useampi TC, luokkaa 20+, ja foorumi herää henkiin. Sitten voin tehdä enable noille komponenteille, ja kaikki toimi taas.
Joten voidaanko vetää johtopäätös, että kaikki syntyi AWS CloudFrontin ongelmista?
Oops 관련 부분은 꽤 놀랍네요 - Cloudfront과 관련이 있을 거라고는 예상하지 못했습니다… 하지만 이제 수정되었다면… 좋습니다!
이것은 단순히 "이 자원이 사이트 간 컨텍스트에서 사용될 수 있다"는 의미입니다. 실제 포럼 HTTP 응답에는 이 헤더를 설정하고 싶지 않을 것입니다. 그러나 인증이 필요하지 않고 개인 정보를 포함하지 않는 정적 자원의 경우, 완전히 문제가 없습니다. 이것이 바로 CORS 시스템이 의도한 사용 방식입니다 - 서버가 어떤 응답이 사이트 간에 사용 가능해야 하는지 선택적으로 제어하는 것이죠.
원한다면 Access-Control-Allow-Origin: my-forum.example.com으로 설정할 수도 있습니다. 하지만 그렇게 하면 나중에 포럼 도메인을 변경할 경우 문제가 발생할 것입니다.