nginx重写发布数据

meW*_*arn 7 rewrite nginx url-rewriting laravel-4

我需要将POST数据保存到不同的URL

重写有效但后期数据丢失

需要将数据从user_info.php发布到userhistory

 location  ~ user_info.php {
  rewrite ^/.* http://testing.com/userhistory  permanent;
 }
Run Code Online (Sandbox Code Playgroud)

数据丢失了.我该如何保存数据?

Day*_*ayo 5

基本上,您想使用301移动永久重定向自动重定向POST请求。

然而。HTTP规范明确禁止此类重定向,其中指出:

如果响应GET或HEAD以外的请求而收到301状态代码,则用户代理不得自动重定向该请求,除非用户可以确认,因为这可能会更改发出该请求的条件。

规范还指出:

在收到301状态代码后自动重定向POST请求时,某些现有的HTTP / 1.0用户代理将错误地将其更改为GET请求。

我相信第二种情况可能是发生了什么,并且当目标服务器正在等待POST数据时,它正在接收GET数据。

您的选择是:

答:更改代码以使用GET数据或更好的POST和GET。IE,查找POST,如果不存在,请尝试GET等效项。

B.尝试通过使用规范来确保代码接收到POST数据。

您可以通过使用proxy_pass指令来处理请求,从而实现选择B。

如:

location  ~ user_info.php {
    proxy_pass http://testing.com/userhistory;
    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;
}
Run Code Online (Sandbox Code Playgroud)

这样,用户在技术上不会被重定向。


Ami*_*ait 5

您只需要编写带有HTTP状态代码307或的Nginx重写规则308

location  ~ user_info.php {
  return 307 http://testing.com/userhistory;
}
Run Code Online (Sandbox Code Playgroud)

307308应该使用Http状态代码代替,301因为它会将请求方法从POST更改为GET。请参阅 https://tools.ietf.org/id/draft-reschke-http-status-308-07.html#introduction

returnrewritenginx doc 相比,通过重定向也更好:https : //www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#taxing-rewrites