Estamos alojando varias aplicaciones web dockerizadas en nuestro servidor web, llamémoslo group.example.com . Sin embargo, nuestros subdominios se manejan a través de nginx como sufijos, lo que se traduce en algo como group.example.com/app1/ group.example.com/app2/ como direcciones URL raíz.
Sin embargo, cuando usamos Django, nos encontramos con problemas, ya que todas sus URL generadas por url en las plantillas como <a href="{% url 'index' %}">home</a> serán enlaces relativos, por lo que se representarán en <a href="/">home</a> . Este vínculo relativo no se interpretará correctamente y conducirá a la página principal, que no es de la aplicación, group.example.com .
Entonces, el objetivo es tener un prefijo basado en la aplicación como /app1/ para todos los enlaces. Puedo codificarlos para enlaces estáticos, pero tiene que haber una forma más elegante. Además, esto genera un problema para los formularios utilizados que se envían a la página incorrecta, redirigiendo nuevamente a la página principal, que no es de la aplicación, group.example.com .
Intenté agregar /app1/ a todas las direcciones URL registradas como prefijo, pero tampoco parece funcionar; de esa manera, la aplicación se ejecuta, pero el usuario debe visitar group.example.com/app1/app1/ para acceder al índice. , y los enlaces relativos siguen sin funcionar correctamente.
En el contenedor docker de la aplicación, estamos ejecutando la aplicación web con nginx y uwsgi . Funciona bien cuando se usan los subdominios correctos, como app1.example2.com , pero no tenemos esa capacidad en nuestro nuevo servidor web más rápido en el que queremos alojar la aplicación.
¿Hay alguna manera de resolver esto usando los contenedores de aplicaciones nginx , uwsgi o django /middleware config para obtener los enlaces para resolver group.example.com/app1/ como root?
Que yo sepa, hay dos formas de solucionarlo.
Uno usa SCRIPT_NAME en la configuración de NGINX. Por ejemplo, basado en esta respuesta de falla del servidor :
location /app1/ { SCRIPT_NAME /app1; # rest of the config } Dos Puede agregar FORCE_SCRIPT_NAME en su configuración.py:
FORCE_SCRIPT_NAME = '/app1'FYI, preferiría usar la primera solución.