回答
收藏
分享
举报
filter模块中的 r != r->main 及其衍生用法
提问于2020-08-10 10:51

浏览 1k

文章标签

作为一个nginx初学者,我最近在上手编写一个类似字符串替换filter模块。其中在阅读其他filter模块的过程中,经常会看到 r != r->mainr == r->main 这样的代码,如下所示:

    if (r == r->main) {
        ngx_http_clear_content_length(r);

        if (!slcf->last_modified) {
            ngx_http_clear_last_modified(r);
            ngx_http_clear_etag(r);

        } else {
            ngx_http_weak_etag(r);
        }
    }

一直无法明白类似这段代码的逻辑的目的所在,查阅了各种资料也没有找到答案,特在此向各位大佬请教!

已修改于2023-03-15 02:12



写下您的回答
发表回答
全部回答(1)

按点赞数排序

按时间排序

这是子请求设计引入的复杂度,slice模块、mirror模块、auth_request模块、缓存的异步更新都使用到了子请求机制。

当业务逻辑复杂时,子请求可以简化逻辑,此时,r->main指向主请求,即客户端请求。

当子请求并发执行时,由于网络不可控,有可能子请求的响应先到达了,不能简单返回给客户端,因此过滤模块中会判断r == r->main


赞同

3

回复举报

回答于2020-08-12 10:19



回复陶辉
回复
小禾先生回复了
大概了解了,多谢陶老师指点!

0

回复举报

回答于2020-08-12 03:15



回复小禾先生
回复
提问者
小禾先生
这家伙很懒还未留下介绍~
0
文章
4
问答
0
粉丝
相关问答