2010-08-02 16 views
21

Tengo una aplicación web creada con Django. Actualmente estoy ejecutándolo en una computadora portátil en casa detrás de un enrutador.Http POST bloquea el puerto en URL

Tengo el enrutador configurado para enrutar todo el tráfico enviado a un puerto específico a esa computadora portátil.

Tengo Nginx como proxy inverso para Apache, usando mod_wsgi para ejecutar Django.

Mi problema es el siguiente: cuando intento presentar cualquier forma POST, el puerto # se retira de la dirección URL (por ejemplo, se convierte en 209.245.23.201:1552/login/ 209.245.23.201/login/)

Naturalmente, esto se rompe ¿Qué causa esto (Nginx, Apache, Django?) Y cómo puedo solucionarlo?

Gracias de antemano.

EDITAR: Parece que los formularios se envían, pero creo que la redirección falla.

EDIT 2: El problema es definitivamente con Nginx o la interacción entre Nginx y Apache. Probé la configuración con Apache como el único servidor, ejecutando django, y funcionó bien. Entonces Nginx está abandonando el puerto, o de alguna manera Apache se confunde con Nginx actuando como proxy.whatever

+0

preguntas tontas ... ¿cómo sabes que se ha eliminado el número de puerto? ¿Como lo descubriste? – luiscolorado

+0

Literalmente se elimina de la URL en mi barra de direcciones. –

+0

Esto podría ser un problema del navegador. ¿Qué navegador estás usando? –

Respuesta

40

Tengo el mismo problema con mi servidor de desarrollo. Después de buscar en Internet, encontré esta discusión (nginx, apache, and odd admin error) donde la solución es modificar la configuración proxy de nginx.

El ajuste de configuración para modificar es:

proxy_set_header   Host $host; 

la solución es agregar el número de puerto:

proxy_set_header   Host $host:$server_port; 

En mi ngnix + apache2 (con mpm trabajador) + django ahora todo funciona bien .

+0

Estaba teniendo exactamente el mismo problema con mi entorno de desarrollo doméstico y esto lo resolvió. Esta debería ser la respuesta aceptada para esta pregunta. – mitchf

+2

En mi caso $ server_port no se estaba resolviendo y tuve que poner mi server_port manualmente ("$ host: 8080"). –

+0

Gracias Techside, esto es genial. Añadiré que tuve que hacer lo mismo que Amit, cuando ejecuté Nginx + Django en Vagrant, donde Vagrant mapeó externo: 8000 a interno: 80, y nginx estaba proxying interno: 80 a django en interno: 8000. $ server_port no resuelto, posiblemente debido a ser 80 en nginx. – kibibu

6

Dado que todo lo que le preocupa es HTTP claro (a diferencia de algo como AJP, por ejemplo) me gustaría ejecutar un protocolo analizador como Wireshark en el host y determinar en qué punto se introduce el redireccionamiento.

2

Revise los registros de errores. En Linux mine están en/var/log/apache2. Simplemente ejecutar una búsqueda de error.log debería activarlo.

10

que desea pasar en el encabezado de host HTTP original, que llegó a nginx:

proxy_set_header Host $http_host; 

Esto parece ser un error con la configuración por defecto de nginx en Debian/Ubuntu, que utiliza sólo $host: $host no contendrá el $server_port. (Esto se configura en /etc/nginx/proxy_params para el paquete Debian/Ubuntu, y es posible anularlo en su configuración después de incluirlo.)

Tenga en cuenta que es diferente de $host:$server_port$http_host. Ver http://wiki.nginx.org/HttpCoreModule#.24host para una explicación.

reportado y solucionado en Debian: http://bugs.debian.org/733016

+1

Esto resuelve mi problema. La respuesta aceptada no es – Philip007

+0

Este es definitivamente el camino a seguir.Estaba haciendo un túnel a través de una instancia de Vagrant, por lo que mi puerto era diferente en el servidor nginx, el servidor Django y el lado de mi navegador. –

+0

¿Perdón por la pregunta de novato, pero dónde en la configuración nginx va la línea proxy_set_header? Dentro del bloque de ubicación? Después de escuchar la línea? ¿En algún otro lugar? ¡Gracias! – Dashdrum

0

Si usted encuentra que esto ocurre con una url derivado del método get_absolute_url() de un modelo, se debe utilizar pasar ese camino a HttpRequest.build_absolute_url() con el fin de anteponer el nombre de host y puerto a la ruta.