subfolders 使用時の svg-sprite における Discourse_docker (blocked:csp) エラー

問題を確認するために、https://sales-community-staging.rainmakers.co/sales-community/ をお気軽にお訪ねください。ただし、この URL が永久に利用可能である保証はありません。

これは、URL に /sales-community が追加されていないことが原因だと考えています。
app.ymlnginx.conf を提供することが役立つ場合は、お知らせください。

これは version: tests-passed での動作です。
修正のために version: stable を試しましたが、現時点では Docker 上でコンパイルが失敗します(以前見た別のバグレポートにも記載されています。私は新規開始しており、ダウングレードしたわけではありません)。

複数枚の画像を投稿できる権限をいただけますでしょうか :slight_smile:

「いいね!」 1

サブフォルダのハウツー文書に従いましたか?

はい。他の機能はすべて正常に動作しています(投稿、メール、アバターアップロード、HTTPS など)。他のすべてのリソースは、適切な /sales-community サブフォルダ URL を持っています(画像を参照)。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)が SVG スプライトシート URL の途中に含まれていることです。

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

私はチェックをより具体的に変更し、URL の 先頭 にのみサブフォルダプレフィックスが含まれているかどうかを確認するようにしました。

ただし、これにより他の潜在的な問題も考えられます。例えば、サブフォルダプレフィックスを /t/about、あるいは Discourse で使用される他の任意の URL に設定したい場合などです :thinking:

「いいね!」 10

@vkozyrev すでにマージされましたので、サイトを更新して、これで問題が解決するかお知らせください :slight_smile:

問題は修正されました @david

これは素晴らしいエッジケースですね :smiley:。私は Rails(api モードのみ)の開発を行っていますが、あまり深く入り込まなくてよかったです。クライアントコードの中で迷い込んでいたかもしれません。

ご興味があればお伝えしますが、この前にはプロキシを配置しており、sales-community サブドメインはユーザーからは隠されています。彼らにはメインサイトの URL の前に /sales-community が表示されるだけです。メインサイトは Heroku 上にあり、すべてのルーティングを単一の nginx インスタンスで処理することはできません。

迅速な対応と修正をありがとうございます、皆さん!

「いいね!」 6