【问题标题】:Django returning HTTP 301?Django 返回 HTTP 301?
【发布时间】:2010-12-07 11:33:42
【问题描述】:

我有一个 django 视图,它在 curl 请求上返回 HTTP 301:

grapefruit:~ pete$ curl -I http://someurl
HTTP/1.1 301 MOVED PERMANENTLY
Date: Fri, 16 Oct 2009 19:01:08 GMT
Server: Apache/2.2.9 (Win32) mod_wsgi/2.5 Python/2.6.2 PHP/5.2.6
Location: http://someurl
Content-Type: text/html; charset=utf-8

我无法从 curl 获取页面内容。但是,如果我使用浏览器访问该页面,我会看到预期的内容。

有什么想法吗?

谢谢, 皮特

【问题讨论】:

    标签: django curl libcurl


    【解决方案1】:

    您可能正在请求不带斜杠的 URL,并且在 settings.py 中将 APPEND_SLASH 设置为 True(默认值),因此 Django 将重定向到包含斜杠的 URL。

    【讨论】:

    • 有趣的是 Postman 没有这样的问题(301)。我猜邮递员加了斜线。
    • 发生在我身上的是我需要在我的请求中添加一个Authorization 标头。在 safari 上,它会 301 并以未经授权的方式发回,因为它不会在重定向发生时保留标头。我习惯于 Chrome 和 Safari 自动执行此操作。添加斜线对我有用。
    【解决方案2】:

    我的问题是 PREPEND_WWW,在 localhost 中使用它时返回 301 错误,我刚刚创建了一个本地设置文件并将其设置为 PREPEND_WWW = False

    【讨论】:

      【解决方案3】:

      在我的例子中,在 settings.py 文件上评论 SecurityMiddleware 就可以了。我不得不说,这只发生在运行runserver 命令时(也就是测试时)。使用 Apache,它不会陷入重定向循环。

      【讨论】:

      • 就我而言,它发生在 gunicorn 的 prod 上。服务器返回与传递的完全相同的位置,这变成了一个无限循环。我通过仅设置 SECURE_SSL_REDIRECT = False 而不是完全删除 SecurityMiddleware 来解决该问题。但我想知道为什么会发生这种情况以及如何实际解决它?
      【解决方案4】:

      所以对我来说,这是以下几点的组合:

      • SecurityMiddleware 已启用
      • SECURE_SSL_REDIRECT = True
      • 单独的 Web 服务器也启用了 SSL 重定向

      在这种情况下,Web 服务器已经进行了重定向并通过 HTTP 将请求转发到 Django,然后再次重定向到 HTTPS,以无限循环结束。

      所以,在这种情况下,设置SECURE_SSL_REDIRECT = False 是安全的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-26
        • 1970-01-01
        • 2014-12-30
        • 2016-07-04
        • 1970-01-01
        • 2017-10-18
        • 2015-11-16
        • 1970-01-01
        相关资源
        最近更新 更多