在什么条件下由代理删除HTTP请求标头?

wpr*_*prl 7 language-agnostic api rest http rfc2616

我正在研究RESTs版本化API的各种方法,并且有三个主要的竞争者.我相信我已经完全使用了X-API-Version.抛开这个争论,反对使用该标头和一般自定义标头的一个论点是,您无法控制何时由代理服务器操纵标头.我很好奇这个实际的例子,当它发生在互联网上,或者它可能在内部网或服务器集群上使用时,或者它可能在任何其他情况下发生时.

dra*_*112 15

该准则对Web内容转换代理1.0是非常明确的指导,以了解和预测符合标准的代理服务器的行为.就您的问题而言,文档的"请求转发请求"部分可能特别有用.

每个代理软件包及其各自的配置都会有所不同,但HTTP代理通常应遵循W3C指南.以下是一些亮点.

4.1代理转发请求:

除了在HEAD和GET代理之间进行转换之外,不得更改请求方法.

如果请求包含Cache-Control:no-transform指令,则代理不得更改请求,除了遵守[RFC 2616 HTTP]部分14.9.5和第13.5.2节中定义的透明HTTP行为并添加头字段如下面4.1.6附加HTTP标头字段中所述.

4.1.3处理非Web浏览器的请求者

在改变HTTP请求和响应的各个方面之前,代理需要考虑到HTTP被用作"传统浏览"以外的许多应用程序的传输机制这一事实.越来越多的基于浏览器的应用程序涉及使用XMLHttpRequest进行数据交换(参见4.2.8转换代理决策),并且这种交换的更改可能会导致误操作.

4.1.5 HTTP标头字段值的更改

除了由[RFC 2616 HTTP]代理应所需的修改不修改比其他报头字段的值的用户代理,接受,接收字符集,接受编码,和接受语言报头字段和不能删除的报头字段(见4.1.5.5原始标题字段).

除了遵守透明HTTP操作之外,代理不应修改任何请求头字段,除非以下适用之一:

  • 由于服务器响应该请求是"不可接受的"(见4.2.4服务器拒绝HTTP请求),将禁止用户访问内容;

  • 用户专门请求重组的桌面体验(参见4.1.5.3用户选择重组体验);

  • 请求是一系列请求的一部分,包括同一网站上包含的资源或链接资源(请参阅4.1.5.4请求顺序).

以下各节详细介绍了这些情况.

注意:

需要强调的是,在存在Cache-Control时不得更改请求:无变换,如请求中的4.1.2 no-transform指令所述.

请求中引用的URI不参与确定是否更改HTTP请求标头字段值.特别是4.2.8转换代理决策中提到的模式并不重要.

4.1.6其他HTTP标头字段

无论是否存在无变换指令:

  • 代理应将请求的发起者的IP地址添加到X-Forwarded-For HTTP头字段中逗号分隔列表的末尾;

  • 代理必须(根据RFC 2616)包含Via HTTP头字段(参见4.1.6.1 Via Header字段的代理处理).


还有许多关于响应头的更改以及能够检测到这些更改的信息.

至于Web服务REST API版本控制,API版本化的最佳实践中有一个非常清晰且有用的SO线程吗?这应该提供丰富的有用见解.

我希望所有这些都有所帮助.照顾自己.


Ono*_*dai 4

这本身并不是一个答案,而是对现实世界场景的提及。

我当前的环境使用混合 CAS/AD 解决方案,以便允许跨多个不同平台(经典 ASP、ASP.NET、J2EE,等等)进行 SSO。

最近我们发现了一些问题 - 解决方案的一部分涉及在需要传播凭据时将 Auth 令牌聚合到 HTTP 标头。一种特定的解决方案,大量使用 cookie,与 nginx 实现相链接,其 HTTP 标头限制设置为 4KiB。如果 cookie 有效负载超过 2KiB,它将开始泄漏标头。

因此,通过 HTTP 标头(包括会话 cookie)进行某种状态/范围控制的应用程序突然开始表现不稳定。

有趣的是,相关的说明是,使用 URL 版本控制(http://server/api/vX.X/resource例如 )的 REST 服务不受影响。