¿Cambios recientes rompen la configuración de subcarpetas?

Perdona si he diagnosticado mal esto, pero recientemente he experimentado algunos problemas tras una actualización en una configuración de subcarpeta que funcionaba correctamente antes, así que creo que puede haber habido una regresión en algunos aspectos recientemente. En particular, estoy autoalojando Discourse usando la configuración de subcarpeta descrita aquí, que funcionaba sin problemas (por lo que puedo ver) hasta hace poco.

Actualmente, al iniciar sesión mediante SSO o al cambiar a/desde el modo anónimo (y quizás en otras situaciones que aún no he identificado), soy redirigido a https://mi_maquina/carpeta_discourse, en lugar de ser redirigido a https://mi_maquina/forum/carpeta_discourse. También ocurre que cuando voy a https://mi_maquina/forum (el punto final correcto), la barra de direcciones se reescribe para mostrar https://mi_maquina (sin la subcarpeta), aunque la mayoría de los enlaces parecen resolverse correctamente.

Lamentablemente, no recuerdo en qué commit estaba cuando todo funcionaba, pero estoy bastante seguro de que estaba bajo el paraguas de “2.4.0.beta10”, y probablemente fue hace unos 10 días. Actualmente estoy ejecutando la versión bd49d4af1a.

Me disculpo si solo estoy haciendo algo estúpido, y estoy encantado de ayudar a investigar el problema si hay sugerencias sobre dónde debería buscar.

1 me gusta

¿Puedes compartir la URL del sitio? ¿Estás utilizando nuestro protocolo SSO o alguna estrategia de OAuth2 / omniauth?

2 Me gusta

Claro, está en https://py.mit.edu/forum (pero actualmente está bloqueado para el acceso público). https://py.mit.edu/forum/login muestra el problema (aunque implementé otra regla de NGINX específicamente para redirigir con código 302 https://py.mit.edu/login de nuevo a https://py.mit.edu/forum/login una vez que empezamos a ver esto, lo cual ha sido una solución temporal para la parte de SSO, al menos).

Estamos utilizando el protocolo SSO de Discourse, que definitivamente funcionaba sin problemas antes. El intercambio de claves sigue pareciendo ocurrir correctamente, solo que al final redirige al lugar equivocado. La clave "return_sso_url" en la carga útil de SSO está llegando correctamente a nuestro punto de conexión SSO (con /forum).

También intenté una reconstrucción, pero no pareció solucionar el problema.

Lamentablemente, esto podría ser difícil de depurar, ya que no me siento cómodo dando acceso a personas ajenas, dado que esta instancia existe para una clase y no me siento cómodo compartiendo datos de estudiantes con terceros (¡incluso si confío en ti personalmente!). Pero si ayuda, estaré encantado de intentar replicar esta configuración en un servidor diferente al que podría darte acceso…

3 Me gusta

También veo que el enlace para entrar/salir del modo anónimo utiliza window.location.reload() para recargar la página después de enviar una solicitud a un endpoint para cambiar al modo anónimo. Por lo tanto, esa recarga definitivamente vería la URL reescrita (ya sin /forum), lo que causaría esto (no estoy seguro si es una historia similar para los problemas de SSO).

Voy a echar un vistazo a los conjuntos de cambios recientes para ver si lo que (creo?) reescribe window.location es una adición reciente.

Además, Discourse.getURL('/login') aún me da el resultado correcto (con /forum).

1 me gusta

Las rutas se restablecen sin el prefijo de subcarpeta en la barra de direcciones del navegador.

Ejemplo:
Visito example.com/forum → después de que se carga el foro, la barra de direcciones muestra example.com
Luego hago clic en “Más recientes” → me navega a lo más reciente y la barra de direcciones muestra example.com/forum/latest
Actualizo la página en el navegador, el sitio se recarga y la barra de direcciones muestra example.com/latest
Cuando vuelvo a actualizar mientras estoy en example.com/latest, aparece un error 404 (porque mi nginx solo enruta /forum a Discourse).

La vista previa del enlace en la esquina inferior izquierda del navegador aparece como example.com/latest, example.com/new, etc. Al recargar un tema también se elimina /forum de la URL, pero luego vuelve a cambiar, regresando a /forum/t/[…].

Anteriormente estaba en la versión 2.4.0.beta2 y no recuerdo este problema.

3 Me gusta

¿Esta instalación se creó siguiendo el soporte de subcarpetas con Docker? ¿Puedes enlazarlo?

7 Me gusta

Sí, también lo probé en una instalación local nueva y obtuve el mismo problema:

app.yml

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"

expose:
 - 80:80

params:
  db_default_text_search_config: "pg_catalog.english"
  version: tests-passed

env:
  LANG: en_US.UTF-8
  UNICORN_WORKERS: 3
  DISCOURSE_RELATIVE_URL_ROOT: /foro
  DISCOURSE_HOSTNAME: localhost
  DISCOURSE_DEVELOPER_EMAILS: yyy

  DISCOURSE_SMTP_ADDRESS: yyy
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: yyy@yyy.yyy
  DISCOURSE_SMTP_PASSWORD: yyy
  DISCOURSE_SMTP_AUTHENTICATION: login

volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
            - git clone https://github.com/discourse/docker_manager.git

run:
    - exec:
        cd: $home
        cmd:
          - mkdir -p public/foro
          - cd public/foro && ln -s ../uploads && ln -s ../backups
    - replace:
       global: true
       filename: /etc/nginx/conf.d/discourse.conf
       from: proxy_pass http://discourse;
       to: |
          rewrite ^/(.*)$ /foro/$1 break;
          proxy_pass http://discourse;
    - replace:
       filename: /etc/nginx/conf.d/discourse.conf
       from: etag off;
       to: |
          etag off;
          location /foro {
             rewrite ^/foro/?(.*)$ /$1;
          }
5 Me gusta

Puedo reproducir el problema en mi instalación en una subcarpeta. Lo solucionaremos.

6 Me gusta

¡Genial, gracias! Me alegra saber que no estoy loco.

Sin embargo, al explorar los commits recientes (más o menos), no pude ver un punto obvio donde ocurriera esta reescritura. ¿Sería posible que me indicaras dónde en el código esto ocurre/ocurría? (Estoy en proceso de familiarizarme con la base de código).

1 me gusta

¡Lo sería! Solo no soy yo la persona indicada. Soy solo “ese tipo” del equipo que por casualidad tiene una instalación de subcarpeta local. Pero no soy ingeniero. David debería poder indicarte el camino correcto cuando comience a trabajar en el problema más adelante esta semana.

6 Me gusta

Casi con seguridad este cambio que fue para este problema. No estoy seguro exactamente cuál es el problema, pero lo investigaré :eyes:

6 Me gusta

Resulta que no tenía nada que ver con ese commit. He encontrado la fuente del problema y ya se está trabajando en una solución:

12 Me gusta

¡Excelente trabajo de detective :man_detective: @david :clap:

6 Me gusta

Esto ya está fusionado: @hartz y @bokos, ¿pueden confirmar que el problema se resolvió después de la actualización?

5 Me gusta

Después de hacer unas pruebas, parece que las cosas funcionan de nuevo. ¡Gracias, @david!

2 Me gusta