首页 > 解决方案 > X-Original-For 标头:它的目的是什么?

问题描述

在记录我的 Web 应用程序(位于负载均衡器 + 防火墙后面)接收到的 HTTP 标头时,我注意到我收到了 X-Original-For 和 X-Original-Proto 标头(除了传统的 X -Forwared-XXX 标头)。

他们的目的是什么?

标签: httpasp.net-corekestrel-http-server

解决方案


简短答案:X-Original-*表示中收到的原始标头值HttpContext.ConnectionHttpContext.Request

长版:使用Nginx//设置反向代理时,和将被更改为header中最左边的值, headers用于保存原始和值:IISApacheHttpContext.ConnnectionHttpContext.RequestX-Forwarded-*X-Original-*HttpContext.ConnectionHttpContext.Request

  1. 原来的HttpContext.Request.Scheme会保存为 header X-Original-Proto: ...,然后HttpContext.Request.Scheme会改成 header 中最左边的 schemeX-Forwarded-Proto: o1, o2, ...
  2. 原来的HttpContext.Request.Host会保存为 header X-Original-Host: <original-host>,然后HttpContext.Request.Host会改成 header 中最左边的主机X-Forwarded-Host: o1, o2, ...
  3. 原来的HttpContext.Connection.RemoteIpAddressHttpContext.Connection.RemotePort将保存为 header OriginalForHeaderName: <original-endpoint>,然后这个值将更改为 header 中最左边的 IP 和端口X-Forwarded-For: o1, o2, ...

查看保存的源代码X-Original-For

requestHeaders[_options.OriginalForHeaderName] = new IPEndPoint(connection.RemoteIpAddress, connection.RemotePort).ToString();

查看保存的源代码X-Original-Proto

requestHeaders[_options.OriginalProtoHeaderName] = request.Scheme;

查看保存的源代码X-Original-Host

requestHeaders[_options.OriginalHostHeaderName] = request.Host.ToString();

推荐阅读