我有一个用Django构建的webapp。我目前正在路由器后面的笔记本电脑上运行它。
我将路由器配置为将发送到特定端口的所有流量路由到该笔记本电脑。
我有Nginx作为Apache的反向代理,使用mod_wsgi来运行Django。
我的问题是:当我尝试提交任何POST表单时,端口#将从网址中删除(例如209.245.23.201:1552/login/变为209.245.23.201/login /)
当然,这会打破。导致这种情况的原因(Nginx,Apache,Django?)以及如何解决?
提前致谢。
编辑:表格似乎提交,但我认为重定向失败。
编辑2:问题无论是Nginx还是Nginx与Apache之间的交互。我尝试使用Apache作为唯一的服务器,运行django,它运行正常。所以要么Nginx正在放弃端口,要么不知何故Apache被Nginx充当代理而感到困惑。无论如何
答案 0 :(得分:41)
我的开发服务器遇到了同样的问题。 经过一些互联网搜索,我发现了这个讨论(nginx, apache, and odd admin error),其中解决方案是修改nginx的代理配置。
要修改的配置设置为:
proxy_set_header Host $host;
解决方案是添加端口号:
proxy_set_header Host $host:$server_port;
在我的ngnix + apache2(带工人mpm)+ django现在一切正常。
答案 1 :(得分:10)
您希望传递到达nginx的原始HTTP主机标头:
proxy_set_header Host $http_host;
这似乎是Debian / Ubuntu中nginx默认配置的错误,它只使用$host
:$host
不会包含$server_port
。
(这是在/etc/nginx/proxy_params
中为Debian / Ubuntu软件包配置的,您可以在包含它之后在配置中覆盖它。)
请注意$host:$server_port
与$http_host
不同。
有关说明,请参阅http://wiki.nginx.org/HttpCoreModule#.24host。
在Debian中报告并修复:http://bugs.debian.org/733016
答案 2 :(得分:6)
鉴于你所关注的一切都是清晰的HTTP(例如AJP之类的东西),我会在主机上运行一个协议分析器,如Wireshark,并确定引入重定向的位置。
答案 3 :(得分:2)
检查错误日志。在Linux上我的是/ var / log / apache2。只是运行搜索error.log应该将其打开。
答案 4 :(得分:0)
如果您发现这是通过从模型的get_absolute_url()方法派生的url发生的,那么您应该使用该路径传递给HttpRequest.build_absolute_url(),以便将主机名和端口添加到路径中。