Rails什么时候回应'transfer-encoding'和'content-length'?

rea*_*not 7 ruby-on-rails nginx chunked-encoding content-length

我正在Rails版本4.1.7/Nginx上构建一个API,它响应来自iOS应用程序的请求.我们在客户端上看到了一些奇怪的缓存,我们认为它与Rails发送回的响应中的微小差异有关.我的问题......

1)我想理解为什么,对于完全相同的请求(只更改了Authorization标头值),Rails transfer-encoding: chunked有时Content-Length: <number>会发回?我认为它可能与响应大小有关,但在我下面粘贴了标题的示例响应中,正文中返回的数据完全相同.

2)有没有办法强迫它使用Content-Length?我们认为这将解决我们的iOS应用程序中的缓存问题.

回复#1

HTTP/1.1 200 OK
Cache-Control: max-age=0, private, must-revalidate
Content-Type: application/json; charset=utf-8
Date: Wed, 18 Mar 2015 00:59:31 GMT
ETag: "86f277ea63295460d4f3bed9a073eaa2"
Server: nginx/1.6.2
Status: 200 OK
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-Request-Id: dd36f139-1986-4da6-9645-4438d41e74b0
X-Runtime: 0.123865
X-XSS-Protection: 1; mode=block
transfer-encoding: chunked
Connection: keep-alive
Run Code Online (Sandbox Code Playgroud)

请求#2

HTTP/1.1 200 OK
Cache-Control: max-age=0, private, must-revalidate
Content-Type: application/json; charset=utf-8
Date: Wed, 18 Mar 2015 00:59:36 GMT
ETag: "86f277ea63295460d4f3bed9a073eaa2"
Server: nginx/1.6.2
Status: 200 OK
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-Request-Id: 0cfd7705-157b-41b5-aa36-739bc6f8302e
X-Runtime: 0.092672
X-XSS-Protection: 1; mode=block
Content-Length: 2234
Connection: keep-alive
Run Code Online (Sandbox Code Playgroud)

Mei*_*ier 2

根据 HTTP 1.1,这两个响应都是有效的,因此您需要修复客户端代码,使其可以处理这两个响应。尝试修复服务器以使其行为方式不会触发客户端中的错误是一个坏主意。nginx 的下一个版本可能会有不同的行为,您的用户甚至可能拥有更改传输的代理,也许只有当他们进行漫游并使用不同的提供商时。

如果您想在标头上进行一些指纹识别,ETag 标头可能会帮助您,因为当响应内容未更改时,无论传输如何,ETag 都应保持不变。

服务器通常在调用动态页面时以块的形式发送,因为这样就不需要为整个页面创建缓冲区并等待所有页面生成。

如果服务器已经有缓冲区,例如因为它在缓存中或内容在文件上并且不太大,则通常会一次性发送响应。一次性发送效率更高,另一方面,用于缓冲输出的额外数据副本需要更多内存,效率较低。因此服务器甚至可以根据可用内存来决定这一点。