Como se sugirió, estoy intentando mantener mi(s) foro(s) antiguo(s) “en su lugar” mientras uso Discourse en el mismo dominio. Logré que Nginx actuara como proxy y evitara conflictos con las URL de Discourse, por lo que todo funciona bien en la carga inicial de la página (y para fines de SEO).
Mi problema son los enlaces a esos enlaces antiguos dentro de Discourse. El enrutamiento de la aplicación de Discourse intercepta esas URL como enlaces internos y, por lo tanto, genera un 404. He intentado de varias maneras solucionar esto con las herramientas disponibles, pero nada funciona con URL o el mismo dominio. (Tampoco quiero poner Discourse en una subcarpeta).
Si tan solo pudiera agregar a la matriz SERVER_SIDE_ONLY para imitar lo que estoy haciendo en Nginx, eso debería funcionar. ¿Alguien tiene alguna sugerencia sobre cómo hacer esto, o algo más?
Eso no es en absoluto lo que recomendaba ese tema. Deberías iniciar tu nuevo foro en un subdominio nuevo y dejar el antiguo atrás.
Creo que eso es correcto. Si realmente quieres que el foro antiguo y el nuevo estén en el mismo dominio (lo que, de nuevo, parece una idea horrible por los problemas que ya has descrito), podrías concebiblemente tener otro dominio que sea un CNAME del antiguo y hacer que Discourse enlace a esos, entonces pensaría que es un servidor diferente y no intentaría manejar esos enlaces por sí mismo y cuando nginx recibiera el enlace, o bien serviría los datos del otro dominio o redirigiría el navegador al correcto.
Consideré poner las cosas viejas en un subdominio archive (arriesgando el impacto en el SEO), pero aun así no creo que haya una forma de que Discourse cambie el enlace que proporciona un usuario, excepto creando un permalink para cada página posible. Supongo que el uso del subdominio archiveeventualmente se impondría a medida que la gente se enterara de él y lo copiara/pegara desde la barra de direcciones del navegador.
Si acabaras de hacer una importación, habría permalinks para todos ellos, pero eso no es muy útil. Y el tipo de cosas que alguien que se gana la vida considerablemente haciendo importaciones podría pensar.
Lo más fácil sería mover el nuevo foro a una nueva URL (esperemos que no arruines mucho el SEO todavía) o mover el foro antiguo a otra (y perder el SEO para las cosas antiguas, aunque podría ser posible hacer una normalización de permalinks o magia de NGINX que hiciera redirecciones). ¿El nuevo sitio lleva mucho tiempo en funcionamiento?
Podrías intentar crear una normalización de permalinks. . . no. Creo que las normalizaciones de permalinks solo funcionan para permalinks y no pueden ser externas. Podría ser posible tener un componente temático que encuentre URLs coincidentes y las reescriba con el nombre de host falso/cname, pero no estoy seguro de lo que llega a la publicación horneada (¿es la URL completa con el nombre de host, o el proceso de horneado elimina el nombre de host?).
¡Puedo manejar esto en la página 404 a través de un script en el HTML del tema…
Hago que la página 404 recargue la ventana del navegador a la URL “faltante”, lo que golpeará el lado del servidor. ¡Funciona! La única desventaja que veo es que la redirección es notable y te sacan de la aplicación para cualquier 404 real (perdiendo la barra lateral/encabezado).
<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>
¡Componente de tema creado! Busca cualquier href al hostname con una ruta que coincida con tus expresiones regulares proporcionadas, luego agrega un evento click para establecer window.location y omitir el enrutamiento interno.
Las URL del mismo dominio se obtienen como onebox y aún tienen el mismo problema que un enlace normal. Mi componente temático se aplicará a cualquier enlace <a> href en la publicación, por lo que también funciona para los enlaces onebox.