Error en Discourse_docker (bloqueado:csp) con svg-sprite al usar subcarpetas

Siéntete libre de visitar https://sales-community-staging.rainmakers.co/sales-community/ para ver el problema. No hay garantías de que esté disponible para siempre. Creo que esto se debe a que no está agregando /sales-community a la URL. Avísame si te sería útil que proporcione app.yml o nginx.conf. Esto está en version: tests-passed. Intenté version: stable para solucionarlo, pero no compila en Docker en este momento (mencionado en otro informe de error que vi antes; estaba comenzando de cero, no bajando de versión).

¿Alguien podría darme la capacidad de publicar más de una imagen? :slight_smile:

1 me gusta

¿Siguiste el documento de instrucciones para subcarpetas?

Sí. Todo lo demás funciona (publicaciones, correos electrónicos, carga de avatares, HTTPS, etc.). Todos los demás recursos tienen las URL correctas en la subcarpeta /sales-community (como se muestra en la imagen). Solo el SVG está roto.

# app.yml

stuff...

DISCOURSE_HOSTNAME: sales-community.rainmakers.co
DISCOURSE_RELATIVE_URL_ROOT: /sales-community

stuff...

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

Sí, el problema no es con CSP porque la URL simplemente está mal; aparentemente no se le está agregando el prefijo de la ruta de la subcarpeta. Creo que hay que añadirlo aquí?

4 Me gusta

Hmm, ¿es esto un error de subcarpeta @eviltrout?

Tenemos toda la lógica en su lugar para los sprites SVG en escenarios de subcarpetas, y varios sitios la utilizan con éxito. En este caso, nos hemos encontrado con un caso límite muy específico. Al verificar las variables clave en el sitio de @vkozyrev (en la consola del navegador):

> Discourse.SvgSpritePath
"/svg-sprite/sales-community-staging.rainmakers.co/svg-2-8ed106e6e3d908b1b86898dfe93a7bac0fd358f4.js"
> Discourse.BaseUri
"/sales-community"

Todo parece correcto. Ahora, al cargar la hoja de sprites SVG, usamos loadScript, que a su vez llama a Discourse.getURL. Esta función es la responsable de agregar el prefijo de la subcarpeta. Probémoslo:

> Discourse.getURL(Discourse.SvgSpritePath)
"/svg-sprite/sales-community-staging.rainmakers.co/svg-2-8ed106e6e3d908b1b86898dfe93a7bac0fd358f4.js"

Vaya… eso no hizo nada. Otra URL aleatoria funciona bien:

> Discourse.getURL("/blah")
"/sales-community/blah"

Una investigación más detallada revela esta línea dentro de getUrl:

if (url.indexOf(Discourse.BaseUri) !== -1) return url;

O, en español: “si la URL ya contiene el prefijo de la subcarpeta, no hacer nada”. Por lo tanto, el problema aquí es que el prefijo de la subcarpeta de @vkozyrev (/sales-community) está incluido en medio de la URL de la hoja de sprites SVG:

/svg-sprite/sales-community-staging.rainmakers.co/svg-2-8ed106e6e3d908b1b86898dfe93a7bac0fd358f4.js

He hecho la verificación más específica, de modo que solo verifica el prefijo de la subcarpeta al inicio de la URL:

Aunque esto me hace pensar en otros problemas potenciales… por ejemplo, si alguien quisiera que su prefijo de subcarpeta fuera /t o /about, o cualquier otra URL que usamos en Discourse :thinking:

10 Me gusta

@vkozyrev eso ya está fusionado, así que por favor actualiza tu sitio y avísanos si eso resuelve el problema :slight_smile:

El problema está solucionado @david.

¡Qué caso límite tan increíble! :smiley:. Trabajo en desarrollo de Rails (solo modo API), y me alegra no haberme adentrado demasiado en ese laberinto, o me habría perdido en el código del cliente.

Por si te da curiosidad, tengo un proxy delante de esto, así que el subdominio sales-community está oculto para los usuarios; solo verán /sales-community al principio de la URL de nuestro sitio principal. El sitio principal está en Heroku, así que no puedo usar una única instancia de nginx para enrutar todo.

¡Gracias por las respuestas rápidas y la solución a todos!

6 Me gusta