Ошибка Discourse_docker (blocked:csp) с svg-sprite при использовании подпапок

Не стесняйтесь перейти по ссылке https://sales-community-staging.rainmakers.co/sales-community/, чтобы увидеть проблему. Гарантий того, что она будет доступна вечно, нет.
Я полагаю, что это связано с тем, что в URL не добавляется /sales-community.
Дайте знать, если будет полезно предоставить app.yml или nginx.conf.
Это на version: tests-passed.
Попытался использовать version: stable для исправления, но в данный момент оно не компилируется в Docker (упоминалось в другом отчёте об ошибке, который я видел ранее; я начинал с нуля, а не понижал версию).

Может ли кто-нибудь дать мне возможность загружать более одного изображения? :slight_smile:

1 лайк

Вы следовали руководству по подпапкам?

Да. Всё остальное работает (публикация, электронная почта, загрузка аватаров, HTTPS и т. д.). Все остальные ресурсы имеют правильные URL-адреса с подпапкой /sales-community (как показано на скриншоте). Сломан только SVG.

# app.yml

stuff...

DISCOURSE_HOSTNAME: sales-community.rainmakers.co
DISCOURSE_RELATIVE_URL_ROOT: /sales-community

stuff...

run:
    - exec:
        cd: $home
        cmd:
          - mkdir -p public/sales-community
          - cd public/sales-community && ln -s ../uploads && ln -s ../backups
    - replace:
       global: true
       filename: /etc/nginx/conf.d/discourse.conf
       from: proxy_pass http://discourse;
       to: |
          rewrite ^/(.*)$ /sales-community/$1 break;
          proxy_pass http://discourse;
    - replace:
       filename: /etc/nginx/conf.d/discourse.conf
       from: etag off;
       to: |
          etag off;
          location /sales-community {
             rewrite ^/sales-community/?(.*)$ /$1;
          }
    - replace:
         filename: /etc/nginx/conf.d/discourse.conf
         from: $proxy_add_x_forwarded_for
         to: $http_your_original_ip_header
         global: true

Да, дело не в CSP, так как URL просто неверный — похоже, к нему не добавляется путь подпапки. Мне кажется, это нужно исправить здесь.

4 лайка

Хм, это баг с подпапкой, @eviltrout?

У нас уже вся логика для SVG-спрайтов в сценариях с подпапками реализована и успешно используется на ряде сайтов. В данном случае мы столкнулись с очень специфическим пограничным случаем. Проверим ключевые переменные на сайте @vkozyrev (в консоли браузера):

> Discourse.SvgSpritePath
"/svg-sprite/sales-community-staging.rainmakers.co/svg-2-8ed106e6e3d908b1b86898dfe93a7bac0fd358f4.js"
> Discourse.BaseUri
"/sales-community"

Выглядит хорошо. Теперь, когда мы загружаем лист SVG-спрайтов, мы используем loadScript, который, в свою очередь, вызывает Discourse.getURL. Эта функция отвечает за добавление префикса подпапки. Попробуем это:

> Discourse.getURL(Discourse.SvgSpritePath)
"/svg-sprite/sales-community-staging.rainmakers.co/svg-2-8ed106e6e3d908b1b86898dfe93a7bac0fd358f4.js"

Хм… ничего не изменилось. Другой случайный URL работает нормально:

> Discourse.getURL("/blah")
"/sales-community/blah"

Немного покопавшись, мы находим эту строку внутри getUrl:

if (url.indexOf(Discourse.BaseUri) !== -1) return url;

Или, по-русски: «если URL уже содержит префикс подпапки, прекращаем». Таким образом, проблема здесь в том, что префикс подпапки @vkozyrev (/sales-community) включён в середину URL листа SVG-спрайтов:

/svg-sprite/sales-community-staging.rainmakers.co/svg-2-8ed106e6e3d908b1b86898dfe93a7bac0fd358f4.js

Я сделал проверку более конкретной, чтобы она проверяла наличие префикса подпапки только в начале URL:

Хотя это заставляет меня задуматься о других потенциальных проблемах… например, если кто-то захочет использовать префикс подпапки /t или /about, или любой другой URL, который мы используем в Discourse :thinking:

10 лайков

@vkozyrev это уже объединено, поэтому, пожалуйста, обновите свой сайт и дайте нам знать, если это решит проблему :slight_smile:

Проблема исправлена, @david.

Это удивительный частный случай :smiley:. Я занимаюсь разработкой на Rails (только в режиме API), и я рад, что не углубился слишком далеко в кроличью нору — иначе бы потерялся в клиентском коде.

На случай, если вам интересно: у меня стоит прокси перед этим, поэтому поддомен sales-community скрыт от пользователей; они видят только /sales-community в начале URL нашего основного сайта. Основной сайт размещён на Heroku, поэтому я не могу использовать один экземпляр nginx для маршрутизации всего трафика.

Спасибо всем за быстрые ответы и исправление!

6 лайков