Имена переменных Nginx теряются между захватами OpenResty

При создании переменной из server_name в Nginx и вызове другой конечной точки с помощью ngx.location.capture переменная исчезает.

Следующий пример демонстрирует вызовы testlocalhost и acclocalhost:

server {
    listen 1003;
    server_name ~^(?<name>test|acc)localhost$; #<-Name is set here

    location / {
        #return 200 $name; #This would return the expected test or acc
        content_by_lua 'local options = {
                            method = ngx.HTTP_GET,
                        }
                        local res = ngx.location.capture("/internal", options)
                        ngx.say(res.body)';
    }

    location /internal {   
        return 200 $name; #<- Name is empty here
    }
}

Есть ли способ поддерживать переменную между конечными точками без изменения тела или использования параметров URL?


person Thomas    schedule 27.09.2017    source источник


Ответы (1)


Вам нужно добавить опцию в ngx.location.capture, чтобы поделиться или скопировать все доступные переменные.

https://github.com/openresty/lua-nginx-module#ngxlocationcapture

copy_all_vars укажите, следует ли копировать все значения переменных Nginx текущего запроса в рассматриваемый подзапрос. модификации переменных nginx в подзапросе не повлияют на текущий (родительский) запрос. Эта опция была впервые представлена ​​в выпуске v0.3.1rc31.

share_all_vars укажите, следует ли совместно использовать все переменные Nginx подзапроса с текущим (родительским) запросом. изменения переменных Nginx в подзапросе повлияют на текущий (родительский) запрос. Включение этого параметра может привести к трудным для отладки проблемам из-за плохих побочных эффектов и считается плохим и вредным. Включайте эту опцию только тогда, когда вы полностью знаете, что делаете.

    location / {
        #return 200 $name; #This would return the expected test or acc
        content_by_lua 'local options = {
                            method = ngx.HTTP_GET,
                            share_all_vars = true
                        }
                        local res = ngx.location.capture("/internal", options)
                        ngx.say(res.body)';
    }
person Maikel    schedule 27.09.2017