【问题标题】:Django's HttpResponseRedirect seems to strip off my subdomain?Django 的 HttpResponseRedirect 似乎剥离了我的子域?
【发布时间】:2010-11-30 05:32:18
【问题描述】:

每当我的 django 站点在视图对象中调用“HttpResponseRedirect”以重定向到另一个 url 时,它都会剥离子域并返回到主站点。我在 Django 的 SVN 分支工作。示例如下:

#Request 以 https://sub1.mydomain.com 的形式出现 定义视图(请求): return HttpResponseRedirect("/test_url") #浏览器实际上会被重定向到https://mydomain.com/test_url


这样做有什么原因吗?我是否必须重定向到包含子域的完整路径?

【问题讨论】:

    标签: django django-urls


    【解决方案1】:

    Django 有一些总是适用于响应的方法。其中之一是django.http.utils.fix_location_header。这可确保重定向响应始终包含绝对 URI(根据 HTTP 规范的要求)。

    此方法使用request.build_absolute_uri,而后者又使用request.get_hostget_host 尝试从 request.META 获取 HTTP_HOST,然后回退到使用 SERVER_NAME

    我的猜测是您的服务器没有提供HTTP_HOST,并且您的SERVER_NAME 设置为mydomain.com

    希望现在您知道自己在寻找什么,您可以运行一些测试来看看出了什么问题。

    【讨论】:

    • 仅供参考,这个答案对于解决“为什么 Django 有时会从 https 重定向到 http?”也很有用。 (例如,在登录表单之后)。如果您的服务器或反向代理没有为 Django 提供准确的request.is_secure,那么fix_location_header 在绝对重定向时会出错。
    • @medmunds 我有这个问题,django 从 https 重定向到 http 从相对 url 进行重定向。 server/proxy究竟应该设置什么样的http header来解决问题?
    • @thedk 类似于 X-Forwarded-Proto 或 X-Forwarded-SSL - 你需要告诉 Django 去注意它。查看docs.djangoproject.com/en/1.4/ref/settings/… 中的 SECURE_PROXY_SSL_HEADER(并认真对待安全警告)。此外,搜索“django request.is_secure”会出现其他一些 1.4 之前的解决方案。
    【解决方案2】:

    HttpResponseRedirect 将简单地返回带有 Location 标头集的 302 状态代码。 url 解析器不会考虑子域(请参阅http://code.djangoproject.com/ticket/8896)。您最好的选择是从头开始重建它(META 上的 HTTP_HOST)或仅使用来自 http://thingsilearned.com/2009/01/05/using-subdomains-in-django/ 的中间件。

    干杯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-05
      • 1970-01-01
      • 1970-01-01
      • 2015-11-11
      相关资源
      最近更新 更多