Commenti "Errore di incorporamento"

TL;DR: Discourse restituisce “Errore nell’incorporamento” indipendentemente dagli host consentiti nelle impostazioni di incorporamento.

Ho un sito pubblicato su foo.com che incorpora i commenti dal forum Discourse su forum.foo.com, il quale funziona correttamente. Quando accedo, ad esempio, a https://foo.com/blog/2019-11-22/foo-0.9.6-released, vedo i commenti incorporati senza problemi. In questo caso, il codice script per l’incorporamento appare nel sorgente della pagina nel seguente modo:

<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>

Ho inoltre una versione di sviluppo del sito in esecuzione sul mio computer locale su localhost, dove incontro problemi con l’incorporamento: continua a restituirmi “Errore nell’incorporamento” invece dei commenti all’interno dell’HTML generato e restituito dal forum. Cioè, vedo il logo del forum e un link ad esso nell’angolo in alto a destra dell’area di incorporamento, ma invece dell’elenco dei commenti ricevo solo quel messaggio di errore.

Quando accedo, ad esempio, a http://localhost:1313/blog/2019-11-22-foo-0.9.6-released/, che è la pagina equivalente a quella del sito di produzione, il codice script per l’incorporamento appare nel sorgente della pagina nel seguente modo:

<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>

Ho provato sia con che senza la barra finale / nell’impostazione discourseEmbedUrl, ma non fa alcuna differenza.

Non ho accesso diretto al server su cui è in esecuzione il forum, ma sono entrato nel pannello di amministrazione del forum e ho provato ad aggiungere diversi host consentiti nelle impostazioni di incorporamento. Le impostazioni attuali, per il sito di produzione che funziona con l’incorporamento, sono:

"Host Consentiti", "Nome Classe", "Whitelist Percorsi", "Pubblica nella Categoria"

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

Quello che ho aggiunto per far funzionare la versione di sviluppo locale del sito è:

"Host Consentiti", "Nome Classe", "Whitelist Percorsi", "Pubblica nella Categoria"

localhost, <vuoto>, /blog/.*, blog
localhost:1313, <vuoto>, /blog/.*, blog
<il mio IP esterno/pubblico come visto dal server del forum>, <vuoto>, /blog/.*, blog
<il mio IP esterno/pubblico come visto dal server del forum>:1313, <vuoto>, /blog/.*, blog

Ma nessuno di questi interventi ha funzionato; continuo a ricevere lo stesso messaggio di errore “Errore nell’incorporamento”.

Sono restio a scavare nel codice sorgente e provare a debuggarlo; preferirei ricevere qualche indicazione su cosa controlla Discourse quando determina che deve generare quel messaggio di errore. Qualcuno può dirmelo e come risolvere? Dovrebbe essere abbastanza semplice, ma Discourse si comporta come una scatola nera in questo caso.

Ho letto tutto di Embed Discourse comments on another website via Javascript ma non fornisce informazioni più utili.

Potresti voler utilizzare topicID come menzionato su Embed Discourse comments on another website via Javascript.

Non mi sorprenderebbe se “localhost” fosse vietato per vari motivi. Questo indicherebbe al tuo server del forum di incorporare i commenti su se stesso. :dizzy_face:

Se stai utilizzando Hugo, potresti caricare il modello dei commenti in modo condizionale o passare esplicitamente baseURL nel modello, in modo che anche durante lo sviluppo venga caricato discourseEmbedUrl: 'https://foo.com/blog/2019-11-22/foo-0.9.6-released'.

@maiki Grazie mille per aver dedicato del tempo a rispondere.

Usare topicId come descritto nella guida non ha risolto il problema né modificato i sintomi. L’URL richiesto cambia ovviamente in https://forum.foo.com/embed/comments?topic_id=2279, ma restituisce esattamente lo stesso messaggio di errore.

Ho anche provato a modificare discourseEmbedUrl in https://foo.com/blog/2019-11-22/foo-0.9.6-released, ma anche questo non ha migliorato la situazione, purtroppo.

Anche se si trattasse di un comportamento intenzionale, dovrebbe essere documentato. Ad esempio, le richieste provenienti da un sito localhost vengono bloccate? Anche se è esplicitamente elencato tra gli host consentiti? Discourse controlla il campo referrer nella richiesta HTTP, o cosa esattamente utilizza per attivare questo errore? È necessario chiarire questa questione, perché al momento non ho trovato nulla che spieghi perché non funziona :slight_smile:

Qual è il messaggio di errore? C’è qualcosa nella console per sviluppatori?

localhost non è un dominio valido, è un nome host.

Non sono sicuro che abbia senso spiegarlo nella guida di incorporamento, ma almeno abbiamo questo argomento a cui fare riferimento! :slight_smile:

No, non c’è nulla di sbagliato nella console degli sviluppatori sul client/browser in locale. L’HTML viene restituito con successo dal server del forum; lo vedo chiaramente negli strumenti di sviluppo.

Ecco come dovrebbe apparire quando funziona (alcuni testi oscurati):

Ecco invece come appare (alcuni testi oscurati):

Quindi, il problema è che il server del forum restituisce 400 e “Errore di incorporamento” invece dei contenuti corretti.

Certo, ma come hai suggerito, forse Discourse sta bloccando questo tipo di richiesta proveniente da referrer di localhost. So che “localhost” non è un nome di dominio ma un nome host. Questo è coerente con il fatto che ciò che configuri per “Host consentiti” nelle impostazioni di incorporamento del forum siano proprio degli host.

So perfettamente cosa sia localhost, non è un problema.

Spiegare cosa sia localhost? No, non è necessario. Quando ho detto che dobbiamo arrivare a una conclusione sul perché non funziona per me e che deve essere documentato, mi riferivo in generale al motivo per cui non ci si aspetta che funzioni, se questo è il caso. Ancora una volta, allo stato attuale, non c’è nulla che suggerisca che questo sia un comportamento atteso.

Il tuo sito Discourse è impostato su “Accesso richiesto”?

La voce “login required” nella sezione “Login” non è spuntata, quindi no, non lo è.

Pensando ad alta voce: la differenza tra quando la richiesta proviene dal mio sito di sviluppo locale e quando proviene dal sito di produzione non è grande. Dovrebbe essere solo il referrer HTTP e, naturalmente, l’origine della richiesta HTTP. A parte questo, uso lo stesso browser per entrambi i siti.

Puoi verificare se si tratta di un problema dell’host provando a incorporarlo su un altro dominio attivo (magari un sottodominio di uno che possiedi).

Penando ad alta voce: se dicessi a Discourse di accettare “localhost”, cercherebbe su localhost, che è il server di Discourse.

Buona fortuna! Non so cosa stia succedendo. :slight_smile:

Capisco il tuo ragionamento. È allora che diventa interessante sapere cosa sta effettivamente controllando quando determina l’accesso e se dovrebbe o meno generare questo messaggio di errore.

A proposito, il punto è che (Discourse, quando risponde alla richiesta incorporata) restituisce un codice di risposta HTTP 400, che significa semplicemente “Richiesta errata”. Se fosse legato a un host non consentito o qualcosa di simile, mi aspetterei che il codice fosse 401 (“Non autorizzato”) o simile, ma non è così. Questo suggerisce che non c’entra nulla con l’autorizzazione o gli host consentiti. Tuttavia, potrebbe anche essere che il codice backend non stia semplicemente restituendo un codice di risposta HTTP corretto.

Di sicuro qualcuno saprà se è possibile o meno incorporare commenti dal dominio forum.foo.com da un sito di sviluppo in localhost? Non vedo nulla che indichi che non dovrebbe funzionare (consentendo gli host), ma dato che non funziona, la situazione è piuttosto poco chiara.

Sembra che ci sia qualcosa di più grande in corso.
Gli header X-Frame-Options sono impostati su ALLOWALL.
Ma ALLOWALL non è un’opzione, vedi X-Frame-Options header - HTTP | MDN
Se provo a incorporare i commenti, ricevo il seguente errore: È stato trovato un header X-Frame-Options non valido durante il caricamento ... 'ALLOWALL' non è una direttiva valida
Solo quando uso topicId i commenti vengono caricati. Ma penso che questo sia perché non hai bisogno dell’intera autorizzazione quando incorpori solo i commenti.

Grazie per averlo segnalato. Su quale browser stai riscontrando l’errore? Il browser è aggiornato?

È su Firefox ed è aggiornato. Ho controllato su Chrome, ma non ha restituito alcun errore, semplicemente non funzionava.

Nel caso in cui qualcuno fosse interessato, ho descritto in dettaglio la mia versione del problema in precedenza e, per qualche motivo, l’incorporamento dei commenti ha funzionato perfettamente quando abbiamo finalmente pubblicato il sito.

Cioè, il problema e i sintomi che ho descritto in precedenza si verificavano quando eseguivo il sito web che incorpora i commenti da forum.domain.com sul mio sistema locale, come localhost o simili. Ma quando ho pubblicato il sito su domain.com, ha funzionato immediatamente.

Come ho già detto, non riesco a trovare nulla nelle impostazioni del forum che impedisca l’accesso o l’incorporamento dei commenti provenienti da fonti diverse da domain.com, quindi il motivo per cui non funzionava rimane un mistero per me. Deve esserci qualcosa nel codice di Discourse che lo impedisce, ma cosa, non lo so.

Ho provato a riprodurre questo problema, ma finora non ci sono riuscito. Con lo script di incorporamento predefinito, i commenti vengono visualizzati correttamente senza errori sia su Chrome che su Firefox (ultime versioni, in esecuzione su Ubuntu).

Un altro elemento da verificare è assicurarsi di aver creato il record host nella sezione Amministrazione / Personalizza / Incorporamento del tuo sito. Lo menziono perché durante i test ricevevo un errore, poiché non avevo compilato l’impostazione “Nome utente per la creazione di argomenti” e salvato le impostazioni di incorporamento.

Ho riscontrato un problema simile e l’ho risolto modificando gli host consentiti in Admin > Personalizza > Incorporamento da example.com a www.example.com e ha funzionato. Ho installato il mio forum su subdomain.example.com e forse è per questo che stava causando problemi.

Comunque, non sono sicuro che questo ti aiuterà, ma spero di sì!