Problema con redirecciones de enlaces permanentes debido a que el fragmento después de "#" no se envía al servidor

EDIT: cambié el título del tema para reflejar el problema que descubrí, gracias a las respuestas a continuación

Estoy experimentando un comportamiento extraño con los enlaces permanentes en mi trabajo de migración.

Mi problema no es el de los enlaces internos que no redirigen. Solo estoy probando esto pegando URLs en la barra de direcciones de mi navegador.

Estos son los dos redireccionamientos que pretendo que ocurran en mis pruebas:

ese es un redireccionamiento de publicación, debería redirigir a la segunda publicación así:

ese es un redireccionamiento de tema, debería ir a:

Sé que mis normalizaciones funcionan correctamente. Mi expresión regular es:

/(?:.*)(\/)(?<topicid>\d*.)-(.[^\/#\?]*)(?<parm>\?(\w*)[=](?<start>\d+))?(?:\/)?(\D+(\/)?)?(?<postid>\d+)?(?:\/)?/normalized.\k<topicid>.\k<postid>

Y las verifico en la consola de rails:

irb(main):069:0> Permalink.normalize_url('https://community.suitecrm.com/languages/17978-why-two-italian-language-packs#16249')
=> "normalized.17978.16249"

irb(main):068:0> Permalink.normalize_url('https://community.suitecrm.com/languages/17978-why-two-italian-language-packs')
=> "normalized.17978."

Eso es lo que pretendía. Tengo esto en mi tabla Permalinks:

Y esto es lo que se ve desde la base de datos:

Pero cuando introduzco esto en la URL del navegador

se redirige a

En lugar de lo que debería ser

Así que veo la primera publicación, pero no se desplaza a la segunda como debería.

¿Por qué se vuelve a agregar ese hash #16249, si mi normalización lo eliminó?

Otra forma de exponer esta incongruencia (aunque de manera un poco artificial) es intentar los siguientes redireccionamientos desde la barra de direcciones del navegador:

https://community.suitecrm.com/normalized.17978.
correctamente redirige a:
Reports disappeared - 💬 General Discussion - SuiteCRM

Y Why two Italian language packs? - #2 by roberto - Translation and Language Packs - SuiteCRM
correctamente redirige a
Reports disappeared - #2 by erevodifosin - 💬 General Discussion - SuiteCRM

Entonces, ¿por qué no funciona cuando se sigue el proceso normal?

Los enlaces permanentes solo funcionan para enlaces entrantes, eso está claro en la descripción.

Deberás corregir los enlaces internos.

Mencioné al principio de mi publicación que no es así; no estoy haciendo clic en enlaces en mis propios foros.

Pero quizás no estoy entendiendo lo que se quiere decir aquí con “enlaces internos”. ¿Puedes explicarlo mejor? Si pego una URL en la barra de direcciones del navegador, ¿cómo es eso un enlace interno?

El identificador de fragmento de la URL (el # y todo lo que sigue) nunca es enviado al servidor por el navegador: no puedes usarlo como parte de una redirección.

Ahora que lo dices, tiene sentido… pero es bastante deprimente.

Supongo que eso descarta por completo las redirecciones adecuadas a nivel de publicación desde mis foros antiguos, ya que usan # para eso :sob:

¿Es esta una limitación común con la que se han enfrentado las personas en las migraciones? Este es el software Kunena, supongo que es bastante común, y apuesto a que otros también usan hashes para enlazar a publicaciones…

He estado dándole vueltas a esto en mi cabeza. Es una limitación muy molesta. Supongo que el error básico se cometió hace mucho tiempo, por los diseñadores de los foros Kunena, al usar solo fragmentos para marcar los enlaces a las publicaciones… suspiro.

Veo 3 enfoques que Discourse podría utilizar para sortear esto (me estoy adentrando claramente en el terreno del pensamiento deseoso, disfruten del viaje):

  1. JavaScript se activa al cargar la página, reconoce que hay un fragmento de hash en la URI y lo usa para llamar al servidor y redirigir al lugar correcto. Funciona, pero se produce una doble redirección y el usuario ve cómo la página se vuelve a cargar.

  2. Discourse podría añadir (del lado del servidor) una etiqueta id con el antiguo post_id importado a cada publicación en el HTML. De esta manera, el navegador transferiría el antiguo id del hash y lo usaría en la página redirigida, desplazándose hasta el final. La principal salvedad: el desplazamiento sofisticado de Discourse, donde las publicaciones solo se cargan cuando haces scroll hacia ellas, hace que este esquema sea insuficiente.

  3. Una mezcla de lo anterior: Discourse construye (del lado del servidor) una tabla de correspondencia entre los antiguos post_id importados y los nuevos post_number, y la envía al cliente al cargar la página. JavaScript en el cliente reconoce que hay un hash en la URI, traduce ese hash usando la tabla y utiliza sus propias funciones de desplazamiento para ir hasta la publicación correcta.

Esto sería laborioso de implementar y tendría una penalización de rendimiento. Sin embargo, permitiría que se produjeran migraciones perfectas…

Estas no son soluciones completas porque las redirecciones no funcionarán a menos que el usuario ya esté en Discourse. Es mucho menos probable que los enlaces externos lleguen de esa manera.

Mi enfoque actual para las redirecciones internas/externas es el siguiente:

Mi sitio antiguo está en
https://suitecrm.com/suitecrm/forum/, y el nuevo en
https://community.suitecrm.com/

Cuando el servidor migrado entre en funcionamiento, realizaremos una redirección de puerta de enlace desde el antiguo hacia el nuevo.

Dejo mis enlaces internos sin cambios, comenzando con https://suitecrm.com/suitecrm/forum/. Cuando alguien hace clic en ellos, en la práctica se consideran externos. Pero luego ocurre nuestra redirección de puerta de enlace y el tráfico vuelve a Discourse, donde los enlaces permanentes deberían activarse con normalidad.

¿Correcto? Aún no lo he probado… Supongo que esto sería imposible si quisiéramos usar el mismo nombre de dominio y carpeta, pero no es nuestro caso.

Lo que necesitas hacer es usar redirecciones de enlaces permanentes.

A menudo creo enlaces permanentes como /oldpost/POST_ID y luego escribo una redirección de enlace permanente para reescribir /forum./category/someslug#1234 y que utilice esos enlaces.

¿Con “redirección de enlace permanente” te refieres a la configuración del sitio normalizaciones de enlace permanente?

¡Ups! Sí. Lo siento. Mi cerebro ya estaba cansado.

Ok :slight_smile:

Pero estoy usando normalizaciones de enlaces permanentes (véase mi primer mensaje). Solo la parte del hash no se envía al servidor (nunca), por lo que, a menos que haya algo de JavaScript del lado del cliente haciendo su magia, no hay forma de que un foro que usa solo hashes para enlaces a nivel de mensaje sea nunca migrado correctamente (en términos de redirecciones) a Discourse (o a cualquier otro software).

Lo siento. No lo leí con suficiente atención. Pensé que había usado contenido después del hash antes, pero supongo que eso es incorrecto. Recuerdo un caso reciente en el que esos IDs de publicación con hash estaban presentes, pero supongo que el cliente solo quería redirecciones a nivel de tema. Creo que para las redirecciones 301, terminar en el tema correcto es probablemente suficiente.