反馈

修复一个nginx-http-concat发生400错误的问题

发布/小网 数据源/原创
“nginx-http-concat”是一个淘宝的开源Nginx模块,是一个能把多个CSS和JS合并成一个请求的Nginx模块。
问题

使用ngx-http-concat加载JS偶尔出现加载不出来的情况,HTTP返回400错误。

分析

通过开发者工具,打开网络面板,找到400错误的请求地址。

1. 分析http的header,发现没有该有的http都存在;

2. 分析异常的请求地址,对比正常的后,发现在地址后多了一个“&_txxxx=xx”的参数,导致进入到ngx-http-concat模块后出现异常。

解决

打开“ngx_http_concat_module.c”文件,找到 “ngx_http_concat_handler”里遍历解析args的for循环,替换成如下代码。

    for (p = r->args.data + 1, v = p; p != e; p++) {
        /* 修复在被劫持后添加参数导致400错误使其加载失败的问题 */
        /* 如果碰到 & 或 # 时,则直接跳出循环 */
        if(*p == '&' || *p == '#'){
            break;
        }else if (*p == ',') {
            rc = ngx_http_concat_add_path(r, &uris, clcf->max_files, &path,
                                          p, v);
            if (rc != NGX_OK) {
                return rc;
            }            v = p + 1;
        } else if (*p == '?') {
            rc = ngx_http_concat_add_path(r, &uris, clcf->max_files, &path,
                                          p, v);
            if (rc != NGX_OK) {
                return rc;
            }            v = p;
            break;
        }
    }