|
@@ -0,0 +1,74 @@
|
|
|
|
+-- 功能:编码 HTTP 返回头
|
|
|
|
+-- 阶段:header_filter_by_lua
|
|
|
|
+-- 备注:
|
|
|
|
+-- aceh = HTTP 返回头的 access-control-expose-headers 字段
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+-- 无论浏览器是否支持,aceh 始终包含 *
|
|
|
|
+local expose = '*'
|
|
|
|
+
|
|
|
|
+-- 该值为 true 表示浏览器不支持 aceh: *,需返回详细的头部列表
|
|
|
|
+local detail = (ngx.ctx._aceh == 1)
|
|
|
|
+
|
|
|
|
+-- 由于接口路径固定,为避免被缓存,以请求头的 --url 值区分缓存
|
|
|
|
+local vary = '--url'
|
|
|
|
+
|
|
|
|
+local h, err = ngx.resp.get_headers()
|
|
|
|
+for k, v in pairs(h) do
|
|
|
|
+ if
|
|
|
|
+ -- 这些头有特殊意义,需要转义 --
|
|
|
|
+ k == 'access-control-allow-origin' or
|
|
|
|
+ k == 'access-control-expose-headers' or
|
|
|
|
+ k == 'location' or
|
|
|
|
+ k == 'set-cookie'
|
|
|
|
+ then
|
|
|
|
+ if type(v) == 'table' then
|
|
|
|
+ for i = 1, #v do
|
|
|
|
+ local x = i .. '-' .. k
|
|
|
|
+ ngx.header[x] = v[i]
|
|
|
|
+
|
|
|
|
+ if detail then
|
|
|
|
+ expose = expose .. ',' .. x
|
|
|
|
+ end
|
|
|
|
+ end
|
|
|
|
+ else
|
|
|
|
+ local x = '--' .. k
|
|
|
|
+ ngx.header[x] = v
|
|
|
|
+
|
|
|
|
+ if detail then
|
|
|
|
+ expose = expose .. ',' .. x
|
|
|
|
+ end
|
|
|
|
+ end
|
|
|
|
+ ngx.header[k] = nil
|
|
|
|
+
|
|
|
|
+ elseif k == 'vary' then
|
|
|
|
+ if type(v) == 'table' then
|
|
|
|
+ vary = vary .. ',' .. table.concat(v, ',')
|
|
|
|
+ else
|
|
|
|
+ vary = vary .. ',' .. v
|
|
|
|
+ end
|
|
|
|
+
|
|
|
|
+ elseif detail and
|
|
|
|
+ -- 非简单头无法被 fetch 读取,需添加到 aceh 列表 --
|
|
|
|
+ -- https://developer.mozilla.org/en-US/docs/Glossary/Simple_response_header
|
|
|
|
+ k ~= 'cache-control' and
|
|
|
|
+ k ~= 'content-language' and
|
|
|
|
+ k ~= 'content-type' and
|
|
|
|
+ k ~= 'expires' and
|
|
|
|
+ k ~= 'last-modified' and
|
|
|
|
+ k ~= 'pragma'
|
|
|
|
+ then
|
|
|
|
+ expose = expose .. ',' .. k
|
|
|
|
+ end
|
|
|
|
+end
|
|
|
|
+
|
|
|
|
+if detail then
|
|
|
|
+ expose = expose .. ',--s'
|
|
|
|
+ ngx.header['--t'] = '1'
|
|
|
|
+end
|
|
|
|
+
|
|
|
|
+ngx.header['access-control-expose-headers'] = expose
|
|
|
|
+ngx.header['access-control-allow-origin'] = '*'
|
|
|
|
+ngx.header['vary'] = vary
|
|
|
|
+ngx.header['--s'] = ngx.status
|
|
|
|
+ngx.status = 200
|