> 问题1. 然后我在log_by_lua和header_filter_
by_lua里想判断请求是否是被如上这个location block处理的,于是我想判断ngx.var.is_php == “1” > 或者ngx.header[“X-srcache-status”] ~= nil,但是我发现,当php存在错误返回了500时,客户端收到的response header里就不会出现“X-srcache-status” 了,
> 而且log显示is_php也是0 (is_php在server block里被初始化为0)这是因为什么呢?
请仔细阅读 add_header 指令的文档,http://nginx.org/en/docs/http/ngx_http_headers_module.html#add_header。默认情况下状态码为 500 时,该指令不生效,加上 always 选项后即可生效。
关于 is_php 仍然是 "0",从你提供的配置里没法进一步分析原因,可以提供更详细的配置吗?
nginx 变量系统的设计上,所有变量值就都是字符串。毕竟初衷是让用户可以灵活配置配置文件,字符串类型已经足够。
> 问题3. 在非500错误的正常情况下,ngx.header[“X-srcache-status”] ~= nil 或则ngx.header[“x-srcache-status”] ~= nil依然为nil,
> 然而在response header里是有X-srcache-status的,这又是为什么呢?
这个描述不太理解。你是想说头里面有 X-srcache-status,但是通过 ngx.header 无法访问到吗?注意下如果你是在 header_filter 阶段去访问的,
你需要注意如果你的 ngx_lua 模块顺序在 add_header 所在的 ngx_http_headers_filter_module 之前,那确实是无法得到的。
> 问题4. 我尝试在header_filter_by_lua里,通过 for k,v in pairs(ngx.header) do ngx.log(ngx.NOTICE, “header->”, k, v) end 来遍历所有的header,
> 但是log中看不到任何信息,这又是。。。为什么呢?
你需要知道 ngx.header 这个 table 本身没有任何内容,它是通过它的元表去查询响应头的,所有遍历无效。你需要使用 ngx.resp.get_headers() 来获取所有响应头。