为什么 django 会忽略来自线路的 HTTP_X_FORWARDED_PROTO 但在测试中却不会?

2024-03-09

如果 HTTP_X_FORWARDED_PROTO 通过网络传输,为什么 django 会忽略它?

我在 settings.xml 中添加了以下配置:

# make sure we know when we are secure when we are behind a proxy
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

我做了一个测试来测试如果

def testHttpSupport(self):
    url = reverse('configuration-list')
    response = self.client.get(url, HTTP_X_FORWARDED_PROTO='https')
    cfg = response.data[0]
    cfg_url = cfg['url']
    self.assertTrue(cfg_url.startswith('https'))

这很好用。返回对象的url以https开头。

但是如果我尝试:

curl -v -H 'HTTP_X_FORWARDED_PROTO: https' http://localhost:8000/api/users/
...
> GET /api/users/ HTTP/1.1
> Host: localhost:8000
> User-Agent: curl/7.51.0
> Accept: */*
> HTTP_X_FORWARDED_PROTO: https
>
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Date: Mon, 03 Jul 2017 16:22:04 GMT
< Server: WSGIServer/0.2 CPython/3.6.1
< Content-Type: application/json
< Allow: GET, POST, OPTIONS
< Vary: Accept, Cookie
< X-Frame-Options: SAMEORIGIN
< Content-Length: 197 
<
* Curl_http_done: called premature == 0
* Closing connection 0
[{"url":"http://localhost:8000/api/users/1/",...

为什么它不像我的单元测试中那样返回基于“https://”的网址?


问题是标题名称。当通过 WSGI 服务器访问 Django 时,您应该使用X-Forwarded-Proto标题而不是HTTP_X_FORWARDED_PROTO:

curl -v -H 'X-Forwarded-Proto: https' http://localhost:8000/api/users/

WSGI协议规定必须遵循相关的CGI规范,其中规定:

名称以“HTTP_”开头的元变量包含读取的值 如果使用的协议是 HTTP,则来自客户端请求标头字段。 HTTP头字段名转换为大写,有全部 出现的“-”替换为“_”,并在前面添加“HTTP_” 给出元变量名称。

(source https://datatracker.ietf.org/doc/html/draft-coar-cgi-v11-03#section-4.1.18)

因此,每当您使用 WSGI 服务器时,X-Forwarded-Proto标题自动转换为HTTP_X_FORWARDED_PROTO在传递给 Django 之前。当你通过HTTP_X_FORWARDED_PROTO标题代替,HTTP_仍必须根据规范预先添加。因此,您最终会得到一个名为HTTP_HTTP_X_FORWARDED_PROTO在姜戈.

self.client不是 WSGI 服务器,通过 kwargs 传入的值将直接插入到 WSGI 环境中,无需任何处理。因此,在这种情况下,您必须自己进行转换并实际使用HTTP_X_FORWARDED_PROTO key:

CGI规范

通过 **extra 发送的标头应遵循 CGI 规范。例如,模拟从浏览器到服务器的 HTTP 请求中发送的不同“Host”标头应作为 HTTP_HOST 传递。

(source https://docs.djangoproject.com/en/1.11/topics/testing/tools/#django.test.Client.get)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 django 会忽略来自线路的 HTTP_X_FORWARDED_PROTO 但在测试中却不会? 的相关文章

随机推荐

  • React-native应用程序不会在后退按钮上关闭

    当按下后退按钮时 我的反应本机应用程序 在 Android 上 不会关闭 它关闭并进入后台并在那里运行 动画 我也尝试过这个 但得到了相同的结果 BackHandler addEventListener hardwareBackPress
  • 为多个应用程序创建安装程序

    嘿 我正在尝试从一台服务器计算机创建多个游戏的安装程序 然后由各个计算机执行 例如 BF 1942 WC3 BF2 DOW 但是 我需要能够选择要安装的应用程序 这是一个简单的复选框 我对 C 的了解有限 解决这个问题的最佳方法是什么 我看
  • Android NDK:如何在没有java的情况下重写NativeActivity中的onBackPressed?

    我的应用程序完全使用 C C 编写NativeActivity 它没有 Java 代码 基于 native activity NDK 示例 按 后退 按钮将其关闭 破坏活动 但我需要此按钮的其他行为 因为我有自己的 UI 和菜单 它们通过
  • PHP-按索引范围获取数组记录

    你好呀 是否有任何 PHP 本机函数可以根据索引的开始和结束返回数组中的记录范围 i e array 0 gt a 1 gt b 2 gt c 3 gt d 现在我只想返回索引 1 和 3 b c d 之间的记录 任何想法 你不能这样做吗
  • WPF Flowdocument paragraph.BringIntoView() 不适用于新文档

    我想加载大 rtf 文件并滚动到其中的特定段落 所以我做了这样的事情 private FlowDocument GenerateDocument string path var doc new FlowDocument using File
  • 如何在WPF中绘制可点击的矩形

    我是 WPF 应用程序的绝对初学者 需要一些帮助 我想做的就是从 A 点到 B 点画一个矩形 and能够检测何时单击矩形 因此 当单击它时 它会变成黄色 再次单击时 它会变成红色 有多种方法可以做到这一点 向矩形添加单击处理程序 并从后面的
  • 键入任何 不能符合 Hashable

    我正在使用 Swift 5 7 新功能 并尝试实现一些异构集 我已将代码简化为这个简单的游乐场 protocol Stuff Hashable var identifier String get struct StuffA Stuff le
  • Java字符串数组反转

    我试图反转 java 数组中的所有字符串 但似乎用第一个字符串覆盖了所有字符串 private static void palindrome String s int flag 0 String reverse for int i 0 i
  • 学习如何分析项目

    我刚刚偶然开始为我公司的一个客户 中小企业 分析一个项目 我是一名 Net 开发人员 5 年 在分析软件方面经验很少 来自学校的 UML 我们刚刚结束了与用户两周的交谈 并得到了一份不错的需求清单 显然 我们已经过滤掉了最重要的需求 并且必
  • 使用 fetchedResultsController 删除表视图中的行

    在 swype 删除期间 此方法最重要的几行 void tableView UITableView tableView commitEditingStyle UITableViewCellEditingStyle editingStyle
  • 如何在 ActionScript 3 中获取用户的屏幕分辨率?

    ActionScript 3 有没有办法检测用户的屏幕分辨率 这些会将数字返回到输出窗口 trace Capabilities screenResolutionX trace Capabilities screenResolutionY
  • Netty:如何处理从 ChunkedFile 接收到的块

    我是 netty 新手 我正在尝试将分块文件从服务器传输到客户端 发送块工作得很好 问题在于如何处理接收到的块并将它们写入文件 我尝试的两种方法都会给我带来直接缓冲区错误 任何帮助将不胜感激 Thanks Override protecte
  • 使用 LINQ to Entities 将多条记录插入表的正确方法

    正如我们许多人所做的那样 我设置了一个简单的循环来从数据库添加多个记录 一个典型的例子是这样的 方法一 A list of product prices List
  • 从图像中删除周围的空白

    我有一组从客户那里收到的产品图片 每张产品图片都是某物的照片 并且是在白色背景下拍摄的 我想裁剪图像的所有周围部分 但只保留中间的产品 这可能吗 举个例子 http www 5dnet de media catalog product d
  • Eclipse 如何针对第三方框架进行代码补全?

    How does the Eclipse editor work to enable code completion For example within the XML editor for Hibernate property file
  • 非静态内部类对象不再被引用后会被垃圾回收吗?

    我有一个类似于以下的 spring bean public class MyServiceImpl private MyDAO myDAO public class MyInnerClass implements SomeInterface
  • 如何在 JavaFX 应用程序中显示 HTML

    我正在开发一个 FontViewer 应用程序 它根据所选的字体样式更改文本的字体 这是我的应用程序的控制器类 public class FXMLDocumentController implements Initializable FXM
  • 使用动作脚本获取IP地址?

    是否可以通过Flash swf Action Script 3获取客户端IP地址 然后将其传递到php文件以将其存储在数据库中 无需在 Flash 中执行此操作 只需在服务器上的 php ip REMOTE ADDR 中执行此操作即可
  • 为什么调试器内存窗口在 VS 2015 中不可用?

    Visual Studio 调试器具有这些内存窗口 用于检查原始内存 在 Visual Studio 2015 中 这些仍然存在 因为存在关联的命令 好吧 文档也是这么说的 然而他们并没有出现 在菜单中 调试 gt Windows gt 没
  • 为什么 django 会忽略来自线路的 HTTP_X_FORWARDED_PROTO 但在测试中却不会?

    如果 HTTP X FORWARDED PROTO 通过网络传输 为什么 django 会忽略它 我在 settings xml 中添加了以下配置 make sure we know when we are secure when we a