首页新闻找找看学习计划

nginx sub_filter不能替换响应内容的奇怪问题

2
悬赏园豆:200 [待解决问题]

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 

dudu的主页 dudu | 高人七级 | 园豆:40998
提问于:2017-01-11 10:06
< >
分享
所有回答(4)
0

 有没有试过低版本

天边的海 | 园豆:150 (初学一级) | 2017-01-11 10:18

没试过

支持(0) 反对(0) dudu | 园豆:40998 (高人七级) | 2017-01-11 10:43

用 nginx/1.4.6 试过了,也是同样的问题

支持(0) 反对(0) dudu | 园豆:40998 (高人七级) | 2017-01-11 18:20
1

看了你的问题,我去看了下自己项目nginx的配置,发现根本没有sub_filter的配置,尴尬……

ps:application/ld+json是什么类型啊,我mime.types文件里都没这种类型

让我发会呆 | 园豆:2629 (老鸟四级) | 2017-01-11 17:29

application/ld+json 是 NuGet 官网服务器返回的一种 MIME 类型

支持(0) 反对(0) dudu | 园豆:40998 (高人七级) | 2017-01-11 17:30

@dudu: 哦,谢谢回复,不过没用过 .net,吼吼……

支持(0) 反对(0) 让我发会呆 | 园豆:2629 (老鸟四级) | 2017-01-11 17:34
1

多测几个地址看和uri中带“-”有没有关系

wpg | 园豆:204 (菜鸟二级) | 2017-01-11 22:17
2

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文件头部插入一些错误的东西,看看出错以后的偏移地址是啥,来推算出真正出错的地方。

嗷嗷 | 园豆:557 (小虾三级) | 2017-01-12 09:16

根据你的回答,从encoding角度找到了线索,虽然nginx配置中设置了 proxy_set_header Accept-Encoding ""; ,nginx请求nuget服务器时没有加Accept-Encoding头,但nuget服务器还是强制使用gzip返回了压缩后的响应内容。

http proxy header: "Content-Encoding: gzip"

 

支持(1) 反对(0) dudu | 园豆:40998 (高人七级) | 2017-01-12 11:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册