1. Cómo operar el encabezado http a través de openresty
el encabezado http se divide en encabezado de solicitud y encabezado de respuesta
El encabezado de solicitud se opera en la etapa access_by_lua de nginx. El encabezado de solicitud de operación involucra dos funciones.
1. ngx.req.get_headers. El primer parámetro solicita el número de encabezados. De manera predeterminada, se analizan 100 encabezados para evitar ataques maliciosos. El segundo parámetro por defecto convierte la información del campo del encabezado a minúsculas. Si se establece en verdadero, se desactivará.
2. ngx.req.set_headers realiza algunas operaciones de configuración en la información del dominio del encabezado y se puede establecer en la tabla
El encabezado de respuesta generalmente opera el encabezado de respuesta en la etapa de filtro de encabezado. Puede leer la información del encabezado de respuesta a través del método ngx.header. *, O puede reescribir la información del encabezado.
En segundo lugar, la prueba
2.1 Prueba get_headers
1.conf / lua / request_header.json
local function print_table(t)
local function parse_array(key, tab)
local str = ''
for _, v in pairs(tab) do
str = str .. key .. ' ' .. v .. '\r\n'
end
return str
end
local str = ''
for k, v in pairs(t) do
if type(v) == "table" then
str = str .. parse_array(k, v)
else
str = str .. k .. ' ' .. v .. '\r\n'
end
end
return str
end
local headers = ngx.req.get_headers()
ngx.say(print_table(headers))
curl -H "Foo:bar" http://localhost:8080/request_header
2. Modificar request_header.json
local headers = ngx.req.get_headers(1)
Después de que nginx -s reload se carga en caliente, solo se imprime un encabezado en respuesta a request_header
3. Modificar request_header.json
local headers = ngx.req.get_headers(0, true)
nginx -s reload Después de la carga en caliente, el encabezado de respuesta request_header permanece sin cambios
2.2 Prueba set_headers
Agregue el archivo conf / lua / sub_request_header.json
cp conf/lua/request_header.json conf/lua/sub_request_header.json
Modifique el archivo conf / lua / request_header.json
local function print_table(t)
local function parse_array(key, tab)
local str = ''
for _, v in pairs(tab) do
str = str .. key .. ' ' .. v .. '\r\n'
end
return str
end
local str = ''
for k, v in pairs(t) do
if type(v) == "table" then
str = str .. parse_array(k, v)
else
str = str .. k .. ' ' .. v .. '\r\n'
end
end
return str
end
--local headers = ngx.req.get_headers(0, true)
--ngx.say(print_table(headers))
ngx.req.set_header('Foo', 'Bar')
local res = ngx.location.capture('/sub_request_header.json')
if res.status == ngx.HTTP_OK then
ngx.say(res.body)
else
ngx.exit(res.status)
end
Subrequest set_header
2.3 Test response.header. *
2.3.1
ngx.header.Foo = 'Bar'
--lua_transform_underscores_in_response_headers
ngx.header['Foo_Bar'] = 'Bar2'
curl -I http://localhost:8080/response_header
La directiva lua_transform_underscores_in_response_headers se establece en nginx.conf, que puede mantener el caso en respuesta.
2.3.2 Modificar response_header.json
2.3.3 Modificar response_header.json, si ContentType se cambia a table, solo se saca el último valor
--ngx.header['Content_Type'] = {"a=32; path", "text"}
ngx.header['content_type'] = {"a=32; path", "text"}
2.3.4 Respuesta de prueba. El tipo de encabezado es la tabla
Modificar response_header.json
ngx.say(type(ngx.header))
2.3.5 Imprimir el contenido del encabezado de respuesta utilizando el método de pares, el contenido de la impresión está vacío
local function print_table(t)
local function parse_array(key, tab)
local str = ''
for _, v in pairs(tab) do
str = str .. key .. ' ' .. v .. '\r\n'
end
return str
end
local str = ''
for k, v in pairs(t) do
if type(v) == "table" then
str = str .. parse_array(k, v)
else
str = str .. k .. ' ' .. v .. '\r\n'
end
end
return str
end
ngx.say(print_table(ngx.header))
2.3.6 Imprimir respuesta.
local function print_table(t)
local function parse_array(key, tab)
local str = ''
for _, v in pairs(tab) do
str = str .. key .. ' ' .. v .. '\r\n'
end
return str
end
local str = ''
for k, v in pairs(t) do
if type(v) == "table" then
str = str .. parse_array(k, v)
else
str = str .. k .. ' ' .. v .. '\r\n'
end
end
return str
end
ngx.header.Foo = 'Bar'
local resp = ngx.resp.get_headers(0, true)
ngx.say(print_table(resp))
(1) Como puede ver en la demostración anterior, ngx.header establece la información del encabezado. *. Cabe señalar que funciones como ngx.set_headers, ngx.print, ngx.c no se pueden usar para cambiar la información del encabezado a través de ngx.header. La razón es que después de que se invocan estas funciones, se activa un controlador de contenido para que regrese. Después de que se devuelve el controlador de contenido, la configuración de la información general no será válida. Si llama a ngx.header después de estas funciones para cambiar la información del encabezado, obtendrá una excepción lua.
(2) ngx.header es una tabla lua ordinaria
(3) Acceda al dominio Foo a través de ngx.header.Foo, que se asignará para indexar internamente, salte a una función C y luego realice dicho acceso
(4) ngx.header.Foo = 'Bar' De esta manera, para cambiar la información de un dominio, se asignará al índice internamente para completar el cambio de información del dominio, no intente usar pares e ipairs para atravesar ngx.header, sino a través de ngx. resp.get_header () para obtener la información del encabezado devuelta, la información obtenida por esta función no está completa
3. Resumen
Solicitud de encabezado (ngx.req.get_headers / ngx.req.set_headers) y encabezado de respuesta (ngx.header / ngx.resp.get_headers) operación y lectura