「Error Embedding」コメント

TL;DR: 許可するホストを埋め込み設定でどれに変更しても、Discourse は「Error Embedding(埋め込みエラー)」を返します。

私は foo.com という公開済みのサイトを持っており、forum.foo.com にある Discourse フォーラムからコメントを埋め込んでいます。これは正常に動作しています。例えば https://foo.com/blog/2019-11-22/foo-0.9.6-released にアクセスすると、埋め込まれたコメントが正しく表示されます。この場合、ページソース内の埋め込み用スクリプトコードは以下のようになっています。

<div id='discourse-comments'></div>
<script type="text/javascript">
  DiscourseEmbed = { discourseUrl: 'https://forum.foo.com/', discourseEmbedUrl: 'https://foo.com/blog/2019-11-22/foo-0.9.6-released' };

  (function() {
    var d = document.createElement('script'); d.type = 'text/javascript'; d.async = true;
    d.src = DiscourseEmbed.discourseUrl + 'javascripts/embed.js';
    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(d);
  })();
</script>

また、ローカルマシンで localhost 上で開発バージョンのサイトを動作させていますが、ここでは埋め込みに問題が発生しています。フォーラムから返される HTML 内にコメントが表示される代わりに、「Error Embedding」というエラーメッセージが表示され続けています。つまり、埋め込み領域の右上にはフォーラムのロゴとリンクが表示されますが、コメント一覧の代わりにエラーメッセージが表示されるだけです。

例えば http://localhost:1313/blog/2019-11-22-foo-0.9.6-released/ にアクセスすると、本番環境のページと同等のページになりますが、ページソース内の埋め込み用スクリプトコードは以下のようになっています。

<div id='discourse-comments'></div>
<script type="text/javascript">
  DiscourseEmbed = { discourseUrl: 'https://forum.foo.com/', discourseEmbedUrl: 'http://localhost:1313/blog/2019-11-22-foo-0.9.6-released/' };

  (function() {
    var d = document.createElement('script'); d.type = 'text/javascript'; d.async = true;
    d.src = DiscourseEmbed.discourseUrl + 'javascripts/embed.js';
    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(d);
  })();
</script>

discourseEmbedUrl 設定の末尾にスラッシュ(/)を付けるか付けないかで試しましたが、違いはありませんでした。

フォーラムが動作しているサーバーには直接アクセスできませんが、フォーラムの管理パネルに入り、埋め込み設定で複数のホストを許可するよう試みました。現在、埋め込みが正常に動作している本番サイトの設定は以下の通りです。

"Allowed Hosts", "Class Name", "Path Whitelist", "Post to Category"

foo.com, <empty>, /blog/.*, blog

ローカル開発バージョンのサイトで動作させるために追加したのは以下の通りです。

"Allowed Hosts", "Class Name", "Path Whitelist", "Post to Category"

localhost, <empty>, /blog/.*, blog
localhost:1313, <empty>, /blog/.*, blog
<フォーラムサーバーから見た私の外部/公開 IP アドレス>, <empty>, /blog/.*, blog
<フォーラムサーバーから見た私の外部/公開 IP アドレス>:1313, <empty>, /blog/.*, blog

しかし、これらを追加しても動作せず、同じ「Error Embedding」メッセージが表示され続けています。

ソースコードを調べてデバッグするのは気が引けるため、Discourse がどのような基準でそのエラーメッセージを生成するかについて、何か知見があれば教えていただきたいです。この問題の原因と解決方法を教えていただけないでしょうか?非常にシンプルなものだと思いますが、Discourse はここではブラックボックスのように振る舞っています。

Embed Discourse comments on another website via Javascript はすべて読みましたが、それ以上の有用な情報は得られませんでした。

Embed Discourse comments on another website via Javascript で言及されている topicID を使用することを検討してください。

さまざまな理由で「localhost」が禁止されている可能性は十分にあります。これでは、フォーラムサーバーが自身にコメントを埋め込むことになってしまいます :dizzy_face:

Hugo を使用している場合は、コメントテンプレートを条件付きで読み込むか、テンプレート内で baseURL を明示的に渡すことをお勧めします。これにより、開発中であっても discourseEmbedUrl: 'https://foo.com/blog/2019-11-22/foo-0.9.6-released' を読み込むことができます。

@maiki ご返信の時間をいただき、誠にありがとうございます。

ガイドに記載されている通り topicId を使用しても、動作しないか症状は変わりませんでした。もちろんリクエストされる URL は https://forum.foo.com/embed/comments?topic_id=2279 に変更されますが、全く同じエラーメッセージが表示されます。

また、discourseEmbedUrlhttps://foo.com/blog/2019-11-22/foo-0.9.6-released に変更してみましたが、これも残念ながら何も改善しませんでした。

意図的な仕様である可能性も否定できませんが、その場合はドキュメントに明記される必要があります。例えば、localhost からのリクエストはブロックされるのでしょうか?許可されたホストに明示的にリストされているにもかかわらずです。Discourse は HTTP リクエストの Referer フィールドを確認しているのでしょうか、あるいはこのエラーをトリガーするために何を使っているのでしょうか?現状では、なぜ動作しないのかを説明できる手がかりが何も見つかっていないため、これを明確にすることが本当に必要です :slight_smile:

エラーメッセージは何ですか?開発者コンソールに何か表示されていますか?

localhost は有効なドメインではなく、ホスト名です。

これを埋め込みガイドで説明する必要があるかはわかりませんが、少なくとも参照用のトピックはありますね! :slight_smile:

いいえ、ローカルホストのクライアント/ブラウザの開発者コンソールには問題はありません。フォーラムサーバーから HTML が正常に返されており、開発者ツールで正常に確認できます。

正常に動作している場合の外観は以下の通りです(一部のテキストは伏せられています):

しかし、実際には以下のように表示されます(一部のテキストは伏せられています):

つまり、フォーラムサーバーが正しいコンテンツの代わりに 400 エラーと「Error Embedding」を返しているだけです。

確かにそうですが、あなたが提案されたように、Discourse が localhost からのリファラーによるこの種のリクエストをブロックしている可能性があります。「localhost」がドメイン名ではなくホスト名であることは承知しています。これは、フォーラムの埋め込み設定で「Allowed Hosts」として設定されているものがまさに「ホスト」であるという事実とも一致します。

localhost が何かはよく知っていますので、そこが問題ではありません。

localhost の説明ですか?いいえ、それは不要です。私が「なぜ私の環境では動作しないのかという結論に達する必要があり、それが文書化されるべきだ」と言ったとき、私が意味しているのは、一般的にこれが動作しないことが想定される理由についてです。現状では、これが期待される動作であることを示す何ら手がかりはありません。

Discourse サイトのログイン設定は「ログイン必須」になっていますか?

「ログイン」セクションにある「ログイン必須」という設定はチェックされていないため、いいえ、設定されていません。

独り言ですが、ローカル開発サイトからのリクエストと本番サイトからのリクエストの違いは、HTTP リファラーと HTTP リクエストの送信元くらいで、それ以外にはほとんどありません。それ以外は、両方のサイトで同じブラウザを使用しています。

別のライブドメイン(お持ちのドメインのサブドメインなど)に埋め込んで、ホスト側の問題かどうかを確認できます。

考えながら:Discourse に “localhost” を許可するように指示すると、Discourse サーバーである localhost 自体を探してしまいます。

頑張ってください!何が起きているのか私にもわかりません。:slight_smile:

「いいね!」 1

あなたの推論は理解できます。アクセスを判定する際に実際には何を確認しているのか、そしてなぜこのエラーメッセージを出力するのかを知ることは、興味深い点です。

関連する話ですが、問題なのは(埋め込みリクエストに応答する際の)Discourse が 400 という HTTP レスポンスコードを返していることです。これは単に「Bad Request(不正なリクエスト)」を意味します。許可されていないホストなどが原因であれば、コードは 401(「Unauthorized(未認証)」)などになるはずですが、そうではありません。つまり、これは認証や許可されたホストとは無関係であることを示唆しています。ただし、バックエンドのコードが適切な HTTP レスポンスコードを出力していない可能性も同様に考えられます。

domain の forum.foo.com からのコメントを localhost の開発サイトから埋め込めるかどうか、知っている人がいるはずです。ホストを許可する設定により動作しないという記述は見当たりませんが、実際に動かないため、原因がはっきりしません。

どうやら、より大きな問題が発生しているようです。
X-Frame-Options ヘッダーが ALLOWALL に設定されていますが、ALLOWALL というオプションは存在しません。詳しくは X-Frame-Options header - HTTP | MDN をご覧ください。
コメントを埋め込もうとすると、次のエラーが表示されます:「… を読み込む際に無効な X-Frame-Options ヘッダーが見つかりました。‘ALLOWALL’ は有効なガイドラインではありません」
topicId を使用した場合のみコメントが読み込まれますが、これはコメントを単に埋め込む場合、完全な権限が不要であるためだと考えられます。

ご報告ありがとうございます。どのブラウザでこのエラーが発生していますか?また、ブラウザは最新バージョンに更新されていますか?

Firefoxで発生しており、最新バージョンを確認済みです。Chromeも確認しましたが、エラーは表示されず、単に動作しませんでした。

「いいね!」 1

もし関心のある方がいれば、以前に私の問題の具体的な状況を詳しく説明しました。なぜか、サイトを公開した段階でコメントの埋め込みは正常に動作しました。

つまり、以前説明した問題や症状は、forum.domain.com からコメントを埋め込むウェブサイトを localhost や同様のローカル環境で実行していた際に発生していました。しかし、サイトを domain.com に公開すると、すぐに正常に動作しました。

以前も述べた通り、domain.com 以外のソースからのコメントへのアクセスや埋め込みを禁止する設定をフォーラム設定で見つけることができませんでした。したがって、なぜ動作しなかったのかは、私にとっては依然として謎です。Discourse のコードにそれを防ぐ何らかの仕組みがあるはずですが、それが何なのかはわかりません。

この問題の再現を試みていますが、現時点では成功していません。デフォルトの埋め込みスクリプトを使用すると、Ubuntu で動作する最新バージョンの Chrome と Firefox の両方で、エラーなしにコメントが表示されます。

もう一つ確認すべき点は、サイトの「管理 / カスタマイズ / 埋め込み」セクションでホストレコードが作成されているかどうかです。これは、私がテスト中にエラーが発生していたためです。その原因は、「トピック作成用のユーザー名」設定を入力せずに埋め込み設定を保存していたことにありました。

「いいね!」 1

私も同様の問題を抱えていたと思いますが、管理者 > カスタマイズ > エンベディングの許可されたホストを example.com から www.example.com に変更することで解決しました。フォーラムは subdomain.example.com にインストールされており、それが問題の原因だったのかもしれません。

それが役に立つかわかりませんが、うまくいけば幸いです!