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

浏览 3.8k

文章标签

作为一个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
粉丝
相关问答

proxy_http_version为1.1,同时Connection: keep-alive,这只是说:HTTP协议是支持长连接的。但客户端要不要使用长连接呢?如果使用长连接,就得有连接池,那么连接池应该是多少呢?毕竟一旦有连接池,就可能存在资源浪费,在用户没有明确的配置keepalive连接池时,Nginx还是不会使用长连接。

点赞 0
浏览 5k

LOG如下:偶数次是超时。

Hello and welcome!

test-->

--->


0:{"user": "demo1","age": 1}

--1->

--2: 200

--3:: [POST] test!

--5->

disconnect()

return :[POST] test!

--->


1:{"user": "demo1","age": 2}

--1->

java.net.SocketTimeoutException: Read timed out

disconnect()

return :java.net.SocketTimeoutException: Read timed out

--->


2:{"user": "demo1","age": 3}

--1->

--2: 200

--3:: [POST] test!

--5->

disconnect()

return :[POST] test!

--->


3:{"user": "demo1","age": 4}

--1->

java.net.SocketTimeoutException: Read timed out

disconnect()

return :java.net.SocketTimeoutException: Read timed out

--->


4:{"user": "demo1","age": 5}

--1->

--2: 200

--3:: [POST] test!

--5->

disconnect()

return :[POST] test!

--->


5:{"user": "demo1","age": 6}

--1->

java.net.SocketTimeoutException: Read timed out

disconnect()

return :java.net.SocketTimeoutException: Read timed out


Process finished with exit code 0


点赞 0
浏览 4.2k