nginx.conf 中是这么写的:
proxy_pass https://api.nuget.org; proxy_set_header Accept-Encoding ""; sub_filter_once off; sub_filter_types application/json application/ld+json; sub_filter "api.nuget.org" "nuget.cnblogs.com";
但奇怪的是有些json响应内容能替换,比如:
https://nuget.cnblogs.com/v3/catalog0/data/2015.02.04.23.59.33/entityframework.6.1.0.json
源地址:
https://api.nuget.org/v3/catalog0/data/2015.02.04.23.59.33/entityframework.6.1.0.json
有些不能替换( api.nuget.org 不能被替换为 nuget.cnblogs.com ),比如:
https://nuget.cnblogs.com/v3/registration1-gz/system.runtime/index.json
源地址:
https://api.nuget.org/v3/registration1-gz/system.runtime/index.json
开始用的 nginx/1.11.7 遇到了这个问题,升级至 nginx/1.11.8 也是同样的问题。
将 nginx 的 http_sub_module 的 debug 日志给整了出来。
不能替换时的 debug 日志:
2017/01/11 21:00:22 [debug] 5081#0: *1 http sub filter "/v3/registration1-gz/system.runtime/index.json" 2017/01/11 21:00:22 [debug] 5081#0: *1 parse: -2, looked: "| ," 00000000009BBE47-00000000009BCB4E 2017/01/11 21:00:22 [debug] 5081#0: *1 parse: -2, looked: "????M^?e?~O5^A^@" 00000000009C8220-00000000009C83DA 2017/01/11 21:00:22 [debug] 5081#0: *1 saved: "| ," 2017/01/11 21:00:22 [debug] 5081#0: *1 sub out: 00000000009D8B28 00000000009BBE47 2017/01/11 21:00:22 [debug] 5081#0: *1 sub out: 00000000009D8B88 00000000009C71FE 2017/01/11 21:00:22 [debug] 5081#0: *1 sub out: 00000000009D8BE8 00000000009C8220
能正常替换时的 debug 日志:
http sub filter "/v3/catalog0/data/2015.02.04.23.59.33/entityframework.6.1.0.json" 2017/01/11 21:47:53 [debug] 21888#0: *1 parse: 0, looked: "" 0000000000DDBE1E-0000000000DDBE33 2017/01/11 21:47:53 [debug] 21888#0: *1 parse: 0, looked: "" 0000000000DDBE40-0000000000DDC02B 2017/01/11 21:47:53 [debug] 21888#0: *1 parse: -2, looked: "" 0000000000DDC038-0000000000DDC77B 2017/01/11 21:47:53 [debug] 21888#0: *1 sub out: 0000000000DF8850 0000000000DDBE1E 2017/01/11 21:47:53 [debug] 21888#0: *1 sub out: 0000000000DF88B0 0000000000D986B3 2017/01/11 21:47:53 [debug] 21888#0: *1 sub out: 0000000000DF8920 0000000000DDBE40 2017/01/11 21:47:53 [debug] 21888#0: *1 sub out: 0000000000DF8980 0000000000D986B3 2017/01/11 21:47:53 [debug] 21888#0: *1 sub out: 0000000000DF89E0 0000000000DDC038
http_sub_module 的源码见:ngx_http_sub_filter_module.c
有没有试过低版本
没试过
用 nginx/1.4.6 试过了,也是同样的问题
看了你的问题,我去看了下自己项目nginx的配置,发现根本没有sub_filter的配置,尴尬……
ps:application/ld+json是什么类型啊,我mime.types文件里都没这种类型
application/ld+json 是 NuGet 官网服务器返回的一种 MIME 类型
@dudu: 哦,谢谢回复,不过没用过 .net,吼吼……
多测几个地址看和uri中带“-”有没有关系
parse: -2 = NGX_AGAIN,
看代码可能是这里造成的
if (pat != pat_end) {
/* partial match */
return NGX_AGAIN;
}
looked: 后面的“ ”之间的东西是正在parse的东西。
出现了"????M^?e?~O5^A^@"这样的东西似乎是一些不可打印的字符,排查一下是否混用了unicode之类的。
00000000009BBE47-00000000009BCB4E之类的就是http header之类的偏移地址。具体怎么定位到JSON文件中的偏移,建议在json文件头部插入一些错误的东西,看看出错以后的偏移地址是啥,来推算出真正出错的地方。
根据你的回答,从encoding角度找到了线索,虽然nginx配置中设置了 proxy_set_header Accept-Encoding ""; ,nginx请求nuget服务器时没有加Accept-Encoding头,但nuget服务器还是强制使用gzip返回了压缩后的响应内容。
http proxy header: "Content-Encoding: gzip"