nginx 重写 post 数据

nginx rewrite post data

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

重写有效,但 post 数据丢失

需要 post 数据从 user_info.php 到 userhistory

 location  ~ user_info.php {
  rewrite ^/.* http://testing.com/userhistory  permanent;
 }

数据丢失。如何保存数据?

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

不过。 HTTP Specifications 明确禁止这种重定向,其中指出:

If the 301 status code is received in response to a request other than GET or HEAD, the user agent MUST NOT automatically redirect the request unless it can be confirmed by the user, since this might change the conditions under which the request was issued.

规范还指出:

When automatically redirecting a POST request after receiving a 301 status code, some existing HTTP/1.0 user agents will erroneously change it into a GET request.

我相信第二种情况可能是正在发生的事情,当目标服务器期待 POST 数据时,它正在接收 GET 数据。

您的选择是:

一个。更改代码以使用 GET 数据或更好,POST 和 GET。即,查找 POST,如果不存在,请尝试 GET 等价物。

乙。尝试通过使用 Spec.

确保代码接收 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;
}

通过这种方式,用户在技术上不会被重定向。

你只需要用HTTP状态码307308写一个Nginx重写规则:

location  ~ user_info.php {
  return 307 http://testing.com/userhistory;
}

HTTP 状态代码 307308 应该被使用而不是 301 因为它将请求方法从 POST 更改为 GET。参考 https://tools.ietf.org/id/draft-reschke-http-status-308-07.html#introduction

根据 nginx 文档,与 rewrite 相比,通过 return 重定向更好:https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#taxing-rewrites

在我的会议中,我使用 try_files 和正则表达式

例如

location /yourfolder/(?<specialRequest>.*) {
    try_files $uri /yourfolder/index.php?r=$specialRequest;
    return 307 https://$host/yourfolder/index.php?r=$specialRequest; // it also work
}