На Android нельзя использовать RTE, а на i-устройствах не удаётся сменить режим редактора

На мой взгляд, это похоже на баг, но тогда я бы увидел тему об этом здесь. Значит, если мой форум — единственный, где это происходит, то проблема, скорее всего, на моей стороне.

Впрочем.

Пользователи на Android не видят виртуальную клавиатуру при использовании редактора форматированного текста. Если переключиться на Markdown, всё работает нормально. iPad и iPhone (Safari/PWA, DiscourseHub) застряли в режиме Markdown и не могут переключиться на RTE.

Как мне кажется, это началось два дня назад. Мои пользователи имеют привычку ждать, прежде чем сообщить, что что-то сломалось.

Что ещё… сам хостинг, 2 контейнера, последняя версия, обновляется каждый день, а на момент написания этой записи самая свежая версия вышла 20 минут назад, режим безопасного запуска не помогает.

Какой мой следующий шаг? Консоль и возможные ошибки — это не вариант на мобильных устройствах.

Они доступны, но для этого нужно подключить устройство к ноутбуку.

Я сделал это с моим планшетом (Android, проблема такая же, как описано выше) и вижу

(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. Но я не могу помочь дальше, чем поделиться сообщением об ошибке, которое я вижу.


Не по теме: Спасибо за смех над вашей категорией «Целую и животные» (К сожалению, в английском переводе написано «cats» [кошки] вместо этого, поэтому я останусь при немецком варианте :wink: )

Я добавил:

DISCOURSE_ENABLE_CORS: true

Затем я загрузил web_only.yml и добавил в CORS origins адреса https://foorumi.katiska.eu и https://cdnfoorumi.katiska.eu.

Безрезультатно.

Потом я выполнил:

curl -sI -H 'Origin: https://foorumi.katiska.eu' 'https://cdnfoorumi.katiska.eu/assets/br/chunk-coedllgv.digested.js'

HTTP/2 403 
content-type: application/xml
access-control-allow-origin: *
access-control-allow-methods: GET, HEAD
access-control-max-age: 3000
server: AmazonS3
date: Thu, 10 Sep 2026 14:13:35 GMT
x-cache: Error from cloudfront
via: 1.1 <characters>.cloudfront.net (CloudFront)
x-amz-cf-pop: HEL51-P1
x-amz-cf-id: <characters>

Я не понимаю, что здесь происходит, но проблема в S3 и моих настройках там? Если да, то почему это началось только недавно? Одним из симптомов может быть то, что с вчерашнего дня я не могу больше писать заметки на досках.

Но если проблема в CORS, почему затронуты только эти элементы?


Почему во имя старых и новых богов ИИ использовал Küsse в этом контексте :rofl:

Я не думаю, что в Discourse недавно были какие-либо изменения, которые могли бы вызвать эту проблему. Однако у S3 давно существует странная особенность с CORS, из-за которой CDN могут кэшировать версию ресурса без заголовка Access-Control-Allow-Origin. А если дело в некорректном кэшировании, это может объяснить, почему проблема затрагивает только некоторых пользователей (вероятно, в зависимости от их местоположения).

По-моему, S3 отправляет заголовок Access-Control-Allow-Origin только в ответ на запросы, содержащие заголовок Origin (то есть запросы от обычного веб-браузера). Когда заголовок Access-Control-Allow-Origin отсутствует, S3 не включает в ответ заголовок Vary: origin. И вот что происходит: если первый запрос к определённому ресурсу исходит не из браузера (например, от curl или какого-либо веб-сканера), CDN может закэшировать версию без заголовка CORS. Очень раздражающе!

Настройка DISCOURSE_CORS здесь вообще не поможет. Она актуальна только для сервера приложения, но не для S3.

В нашем хостинге мы обходим эту проблему, настраивая Cloudfront так, чтобы он добавлял Access-Control-Allow-Origin: * ко всем ответам. Это гарантирует, что странное поведение S3 не приведёт к кэшированию некорректного результата.

В качестве альтернативы можно настроить Cloudfront так, чтобы он включал заголовок запроса Origin в ключ кэша. Тогда ответы без CORS будут храниться отдельно от ответов с CORS.

У Amazon есть много документации по CORS здесь. У меня в заметках была эта ссылка, которая, как оказалось, вела на форумную тему именно об этой проблеме… но похоже, её удалили :cry:

Но я не использую Cloudfront, значит, это должно исходить от AWS?

Вы уверены? :eyes:

❯ host cdnfoorumi.katiska.eu
cdnfoorumi.katiska.eu is an alias for djpzno7cbajfp.cloudfront.net.

P.S.: чтобы быть точным, речь идёт об AWS Cloudfront, а не о Cloudflare (названия очень похожи! :sweat_smile:)

Да, это правда — я, конечно, использую AWS Cloudfront :laughing: Если не ошибаюсь, для этого нужна собственная доменная зона. Или что-то в этом роде.

Да, именно так — это требуется для кастомного домена, и это также позволяет сэкономить (если я правильно помню, трафик из Cloudfront дешевле, чем прямой трафик из S3).

Сначала я удалил все упоминания S3 из файла web_only.yml. Затем выполнил rebuild, а для надёжности — rake posts:rebake. Проблемы исчезли, но, конечно, изображения по-прежнему загружались через CDN. Я вернул S3, и проблема вернулась.

Я зашёл в AWS и посмотрел настройки distribution в CloudFront. Там была доменная зона, которой, по крайней мере, три года, и её TLD изменился. Я удивляюсь, что вообще что-то работало. Я изменил настройки в соответствии с рекомендациями CloudFront и где-то добавил access-control-allow-origin: * (что, конечно, глупо, так как это делает CORS бессмысленным). Хотя, насколько я понимаю, этот заголовок уже подавался через CloudFront.

Для надёжности я снова выполнил rebuild и протестировал. Не помогло.

Так как возможно, что кэш «злющийся», я инвалидировал /assets/* и, для надёжности, также /assets/br/*. Снова rebuild, и теперь проблема была исправлена.

Был исправлен и ещё один вопрос. С лета у меня была проблема с Oops…, то есть ошибкой 50x после rebuild. Когда я включаю безопасный режим и отключаю темы, я могу войти в админку. Мне нужно отключить несколько TC, более 20, и форум «оживает». После этого я могу включить эти компоненты, и всё снова работает.

Так можно ли сделать вывод, что всё произошло из-за проблем с AWS CloudFront?

Вещь с Oops довольно удивительна — я бы не ожидал, что это связано с Cloudfront… Но если это уже исправлено… отлично! :sweat_smile:

Это просто означает, что «этот ресурс разрешено использовать из кросс-сайтового контекста». Скорее всего, вы не хотели бы видеть этот заголовок в HTTP-ответах самого форума. Но для статических ресурсов, которые не требуют аутентификации и не содержат никакой частной информации, это вполне допустимо. Именно так и должна работать система CORS — серверы избирательно контролируют, какие ответы должны быть доступны кросс-сайтово.

Если вы действительно захотите, вы можете установить Access-Control-Allow-Origin: my-forum.example.com. Но тогда у вас возникнут проблемы, если вы когда-нибудь решите сменить домен форума.