Wie vorgeschlagen, versuche ich, mein altes Forum („in place“) zu belassen, während ich Discourse auf derselben Domain verwende. Ich habe es geschafft, nginx so zu konfigurieren, dass es als Proxy fungiert und Konflikte mit Discourse-URLs umgeht, sodass alles beim ersten Laden der Seite (und für SEO-Zwecke) bestens funktioniert.
Mein Problem sind Links zu diesen alten Links innerhalb von Discourse. Das Discourse-App-Routing fängt diese URLs als interne Links ab und führt somit zu einem 404. Ich habe zahlreiche Wege versucht, dies mit den vorhandenen Werkzeugen zu umgehen, aber nichts funktioniert mit URLs oder derselben Domain. (Ich möchte Discourse auch nicht in einem Unterordner platzieren.)
Wenn ich nur etwas zum SERVER_SIDE_ONLY-Array (SERVER_SIDE_ONLY) hinzufügen könnte, um das nachzuahmen, was ich in nginx tue, sollte das funktionieren. Hat jemand Vorschläge, wie das geht, oder etwas anderes?
Das ist überhaupt nicht das, was in diesem Thema empfohlen wurde. Sie sollten Ihr neues Forum auf einer neuen Subdomain starten und die alte hinter sich lassen.
Ich denke, das ist richtig. Wenn Sie wirklich das alte Forum und das neue auf derselben Domain haben möchten (was, wie gesagt, für die von Ihnen bereits beschriebenen Probleme eine schreckliche Idee zu sein scheint), könnten Sie theoretisch eine andere Domain haben, die ein CNAME für die alte ist, und Discourse darauf verlinken lassen. Dann würde es denken, dass es ein anderer Server ist und würde nicht versuchen, diese Links selbst zu verarbeiten, und wenn nginx den Link erhält, würde es entweder die Daten von der anderen Domain bereitstellen oder den Browser zur richtigen weiterleiten.
Ich habe erwogen, die alten Inhalte auf eine archive-Subdomain zu legen (was das SEO-Ranking beeinträchtigen könnte), aber selbst dann glaube ich nicht, dass es eine Möglichkeit gibt, Discourse dazu zu bringen, den von einem Benutzer bereitgestellten Link zu ändern, außer durch die Erstellung eines Permalinks für jede mögliche Seite. Ich nehme an, die Nutzung der archive-Subdomain würde schließlich übernommen werden, da die Leute davon erfahren und sie aus der Adressleiste des Browsers kopieren/einfügen.
Wenn Sie gerade einen Import durchgeführt hätten, gäbe es für all diese Permalinks, aber das ist nicht sehr hilfreich. Und die Art von Dingen, die jemand, der einen erheblichen Teil seines Lebensunterhalts mit Importen verdient, denken könnte.
Das Einfachste wäre, das neue Forum auf eine neue URL zu verschieben (hoffentlich würden Sie noch nicht viel SEO durcheinander bringen) oder das alte Forum auf eine andere zu verschieben (und SEO für die alten Inhalte zu verlieren, obwohl es möglich wäre, eine Permalink-Normalisierung oder NGINX-Magie zu machen, die Weiterleitungen durchführt). Ist die neue Seite schon lange in Betrieb?
Sie könnten möglicherweise eine Permalink-Normalisierung erstellen. . . nein. Ich glaube, permalink_normalizations funktionieren nur für Permalinks und sie können nicht extern sein. Es könnte möglich sein, eine Theme-Komponente zu haben, die passende URLs findet und sie mit dem Fake/CNAME-Hostnamen neu schreibt, aber ich bin mir nicht sicher, was in den gebackenen Beitrag gelangt (ist es die vollständige URL mit Hostnamen oder entfernt der Backprozess den Hostnamen?).
! Ich kann dies auf der 404-Seite über ein Skript im Theme-HTML handhaben…
Ich lasse die 404-Seite das Browserfenster zur “fehlenden” URL neu laden, was den Server trifft. Es funktioniert! Der einzige Nachteil, den ich sehe, ist, dass die Weiterleitung auffällt und man die App für echte 404s verlässt (Seitenleiste/Header gehen verloren).
<script type="text/discourse-plugin" version="0.8">
api.onPageChange((url, title) => {
const router = api.container.lookup('service:router');
var is404 = document.getElementsByClassName("page-not-found");
if (is404.length) {
const params = new URLSearchParams(router.currentRoute.queryParams).toString();
let q = "";
if (params){ q = "?"+params; }
window.location.replace(window.location.origin + url + q);
}
});
</script>
Ich denke, Sie sollten sie auf der Clientseite abfangen können, wie ich zuvor vorgeschlagen habe. Enthalten die Links zur alten Website im HTML den Hostnamen?
Theme Component erstellt! Er sucht nach hrefs zum hostname mit einem Pfad, der mit Ihren bereitgestellten Regexes übereinstimmt, und fügt dann ein click-Ereignis hinzu, um window.location festzulegen und das interne Routing zu überspringen.
Same-Domain-URLs werden einbezogen und haben immer noch das gleiche Problem wie ein einfacher Link. Meine Theme-Komponente wird auf alle <a> href-Links im Beitrag angewendet, sodass sie auch für einbezogene Links funktioniert.