如何将Nginx GET请求重写为POST?

如何将Nginx GET请求重写为POST?,nginx,postgrest,Nginx,Postgrest,我的使用案例是,我有一封包含“验证您的电子邮件地址”链接的电子邮件。当用户单击此链接时,用户代理将执行GET请求,如: GET http://widgetwerkz.example.com/confirm_email?challenge=LSXGMRUQMEBO 服务器将作为POST执行此操作(因为这是一个副作用操作)。我根本无法访问服务器代码。目标请求应为: POST http://widgetwerkz.example.com/rpc/verify { "challenge": "LSX

我的使用案例是,我有一封包含“验证您的电子邮件地址”链接的电子邮件。当用户单击此链接时,用户代理将执行GET请求,如:

GET http://widgetwerkz.example.com/confirm_email?challenge=LSXGMRUQMEBO
服务器将作为POST执行此操作(因为这是一个副作用操作)。我根本无法访问服务器代码。目标请求应为:

POST http://widgetwerkz.example.com/rpc/verify

{ "challenge": "LSXGMRUQMEBO" }
我可以执行什么Nginx重写来实现这一点

编辑:上下文中的解决方案

http {
    server {
        # ... 
        location /confirm_email {
            set $temp $arg_challenge;
            proxy_method POST;
            proxy_set_body '{ "challenge": "$temp" }';
            proxy_pass http://127.0.0.1/rpc/verify;
            set $args '';
        }
    }
}
这将所有这些结合在一起:

  • 将请求从GET转换为POST
  • 将位置从
    /confirm\u email
    重写为
    /rpc/verify
  • 从请求中删除查询字符串(例如,生成的url只是
    /rpc/verify
    ,没有
    ?challenge=LSXGMRUQMEBO
  • 添加JSON正文:
    {“challenge”:“LSXGMRUQMEBO”}

感谢伊万让我走上正轨

你需要这样的东西:

location /confirm_email {
    proxy_method POST;
    proxy_set_body '{ "challenge": "$arg_challenge" }';
    # your proxy_set_headers and other parameters here
    proxy_pass <your_backend>/rpc/verify?;
}
位置/确认\u电子邮件{
代理法岗;
proxy_set_body'{“challenge”:“$arg_challenge”}”;
#您的代理设置标题和其他参数
代理_pass/rpc/verify?;
}

您的nginx是否充当后端的反向代理服务器?是的,nginx是本地反向代理。这几乎可以正常工作,但是查询参数仍然是请求的一部分:
POSThttp://widgetwerkz.example.com/rpc/verify?challenge= LSXGMRUQMEBO
这会导致后端出现问题。请尝试在
/rpc/verify
之后添加一个问号,这可能会有所帮助。如果没有,请写一条评论,我会寻找另一种方法来摆脱它。成功了,谢谢!