Operar encabezado de solicitud HTTP a través de lua

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

524 artículos originales publicados · elogiados 172 · 100,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/INGNIGHT/article/details/104914689
Recomendado
Clasificación