Maison > Questions et réponses > le corps du texte
Chers maîtres, j'ai besoin de déterminer les paramètres dans l'url pour obtenir la valeur du paramètre de service. L'url a des requêtes GET et POST. Je l'ai fait en utilisant nginx+lua. Le code est le suivant :
location / {
set_by_lua $service '
local request_method = ngx.var.request_method
if request_method == "GET" then
local arg = ngx.req.get_uri_args()["service"] or 0
return arg
elseif request_method == "POST" then
ngx.req.read_body()
local arg = ngx.req.get_post_args()["service"] or 0
return arg
end;';
if ($service = 'register')
{
proxy_pass http://userinfo;
}
proxy_redirect off;
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
Le problème maintenant est que lorsque je demande en utilisant GET, tout est normal, mais lors d'une demande en utilisant POST, Nginx signale une erreur 500.
J'utilise le code suivant pour déboguer :
local request_method = ngx.var.request_method
if request_method == "GET" then
local arg = ngx.req.get_uri_args()["service"] or 0
ngx.say(arg)
elseif request_method == "POST" then
ngx.req.read_body()
local arg = ngx.req.get_post_args()["service"] or 0
ngx.say(arg)
end
Les valeurs des paramètres de service imprimées dans les méthodes de requête GET et POST sont correctes.
Maintenant, je ne sais pas où se situe le problème ? Demandez à Dieu de me le dire. gratitude. . .
为情所困2017-05-16 17:18:40
Lorsque vous utilisez set_by_lua, s'il s'agit d'une soumission POST, lors de l'appel de ngx.req.read_body(), il est interdit d'appeler le read_body dans le module set_by_lua (échec de l'exécution de set_by_lua : set_by_lua:6 : API désactivée dans le contexte de set_by_lua
stack traceback : [C] : dans la fonction 'read_body' set_by_lua:6 : dans la fonction <set_by_lua:1>);
Mais vous pouvez utiliser rewrite_by_lua, tel que :
location / {
set $service '';
rewrite_by_lua '
local request_method = ngx.var.request_method
if request_method == "GET" then
local arg = ngx.req.get_uri_args()["service"] or 0
ngx.var.service = arg
elseif request_method == "POST" then
ngx.req.read_body()
local arg = ngx.req.get_post_args()["service"] or 0
ngx.var.service = arg
end;';
if ($service = 'register')
{
proxy_pass http://userinfo;
}
proxy_redirect off;
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
J'espère que cela pourra vous aider. De plus, il est recommandé de ne pas utiliser $service comme nom de variable. Il se peut que le mot-clé soit en conflit avec la variable système.
phpcn_u15822017-05-16 17:18:40
Veuillez me donner quelques conseils à partir de l'affiche originale. Je ne sais pas pourquoi mon ngx.req.get_post_args() n'obtient jamais la valeur, mais ngx.req.get_body_data() le fait. Quelle pourrait en être la raison ?
给我你的怀抱2017-05-16 17:18:40
ngx.req.get_post_args() ne peut être utilisé que dans les étapes rewrite_by_lua, access_by_lua, content_by_lua*, et vous devez appeler ngx.req.read_body() avant utilisation, ou activer l'option
lua_need_request_body pour forcer ce module pour lire le corps de la requête (cette méthode n'est pas recommandée)