django admin 在保存时重定向到错误的端口

Posted

技术标签:

【中文标题】django admin 在保存时重定向到错误的端口【英文标题】:django admin redirects to wrong port on save 【发布时间】:2012-01-25 08:17:52 【问题描述】:

我有一个使用 nginx+apache 设置的 django 项目。用于外部访问的 http 端口是 20111,然后将其转发到服务器机器(具有内部 IP)到端口 80。因此 nginx 侦听端口 80(并将相关请求传递给端口 5000 上的 apache)。

现在可以通过http://externalip:20111 从外部访问初始登录 - 但是当我完成管理操作(例如保存条目)时,我会被重定向到http://externalip/path/to/model - 没有端口 20111。结果是超时.如何告诉 django 对所有管理员重定向使用特定的主机名/端口(即http://externalip:20111)?

【问题讨论】:

我认为您的站点 (externalip:20111/admin/sites/site) 在其域字段中没有端口。您的站点域似乎是“externalip”而不是“externalip:20111”。这是正确的吗? 我没有使用站点框架。你是说如果我启用它,它会自动让管理框架在所有重定向上使用 Site.domain? 好的,我现在尝试使用 Site 框架,我在域字段中包含端口并将 SITE_ID 设置为正确的 ID,但管理员仍然将我重定向到没有端口 20111 的基本 url . 因此管理员使用 django/contrib/contenttypes/views.py 中的视图“快捷方式”进行重定向。根据代码,第 61 行“object_domain = get_current_site(request).domain”决定使用哪个域,例如: http.HttpResponseRedirect('%s://%s%s' % (protocol, object_domain, absurl)) (其中 absurl 是 get_absolute_url 的返回值。我建议您调试此视图(blog.yourlabs.org/debugging-python-and-django-code 可以提供帮助)并确定域来自哪里。(我假设您重新启动了服务器,如果您没有重新启动,请这样做) 我找到了解决方案。我发现了这个问题:***.com/questions/3391986/http-post-drops-port-in-url。发帖人也有同样的问题,几乎相同的解决方案对我有用,只是nginx无法解析$server_port,所以我直接输入端口:proxy_set_header Host $host:20111; -- 无论如何,非常感谢您的帮助! 【参考方案1】:

在代理或负载均衡器后面部署应用程序时,通常依赖X-Forwarded-Host 标头。 Django 为它提供了support

首先,您必须设置 nginx 以发送正确的标头。添加到您的 nginx 主机配置(在您的 location 部分内):

proxy_set_header X-Forwarded-Host $host:20111;

其次,添加到你的settings.py:

USE_X_FORWARDED_HOST = True

它将允许 django 信任来自请求的 X-Forwarded-Host 标头。

它应该适合你。出于安全原因,您不应信任在X-Forwarded-Host 中发送的每个值,因此请将您信任的域/IP 添加到ALLOWED_HOSTS in settings.py

【讨论】:

以上是关于django admin 在保存时重定向到错误的端口的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 中,如何在提交 CreateView 时重定向到 UpdateView?

在 Django 中接受垃圾 url 时重定向到登录页面

Django - 基于组在登录时重定向

Sentry 捕获错误时重定向到新页面

提交表单时重定向到错误的路线

javascript 加载的局部视图 MVC 中发生错误时重定向到错误页面