nginx 将 POST 请求重定向到 GET 请求

2024-02-15

我有 Rails 4.1 应用程序运行puma网络服务器。我使用 nginx 作为代理服务器。几天前,一切都进展顺利。我更新了我的应用程序,突然有些POST请求开始重定向到相同的网址,但作为GET要求。我尝试回滚到以前的工作版本,但没有成功。

我发现非常有趣的行为。我测试了我的 APIcurl.

  • 如果我这样做了POST请求到urlhttp://myapp.com/tasks/easy_task/calculate/它重定向到相同的网址 但作为GET要求。
  • 然后我做了POST请求http://myapp.com/,返回404
  • 然后我做了POST请求http://myapp.com/tasks,返回404
  • 然后我做了POST请求http://myapp.com/tasks/easy_task,返回404
  • 然后我做了POST请求http://myapp.com/tasks/easy_task/calculate,返回 200。耶!

当我使用chrome的应用程序时也发生了同样的事情Postman。首先它重定向,但经过前面的步骤后它运行良好。

我在其他应用程序中使用此应用程序。我用RestClient发出 http 请求。当我尝试制作时POST请求它引发异常RestClient::MovedPermanently (301 Moved Permanently).

  • 我重新安装了nginx to 1.7.3.
  • 重启服务器(虚拟机)
  • 重新部署我的应用程序,部署以前的版本
  • 没有成功:(

我在 stackoverflow 上发现了类似的问题,但没有一个给我解决这个问题的线索。我希望你能帮助我解决这个问题。提前致谢!

类似问题: -POST 请求变成 GET 请求 https://stackoverflow.com/questions/24028719/post-request-turns-into-get-request - POST请求神秘地变成了GET请求 https://stackoverflow.com/questions/24028322/post-request-mysteriously-turn-into-get-request

nginx 配置:

$ cat /etc/nginx/sites-enabled/myapp.com.conf
# The file generated by Chef for mycompany

upstream myapp_mycompany_com {
  server unix:/tmp/myapp.com-puma.sock;
}

server {
  server_name  myapp.com;
  listen       80;

  access_log /var/log/nginx/myapp.com-access.log;
  error_log /var/log/nginx/myapp.com-error.log;

  root /home/projects/mycompany/myapp.com/current/public;

  gzip on;
  gzip_types text/plain text/xml application/xml application/xml+rss
             text/css text/javascript application/javascript application/json;

  error_page 551 =503 @maintenance;
  location @maintenance {
    rewrite ^(.*)$ /system/maintenance.html break;
  }
  set $maintenance 0;
  if (-f $document_root/system/maintenance.html) {
    set $maintenance 1;
  }

  if ($request_uri = /favicon.ico) {
    # Browsers will try to get favicon if it's not returned with 200ok status
    set $maintenance 0;
  }
  if ($maintenance) {
    # There can be several reasons for 503 error. We custom return 551 error
    # to ensure maintenance.html is only shown when it's really maintenance
    return 551;
  }

  rewrite ^/(.*)/$ /$1 permanent; # Truncate trailing slashes
  try_files $uri @rails;

  expires -1;

  location = /favicon.ico {
    try_files $uri =204;
    access_log off;
    log_not_found off;
  }

  location @rails {
    proxy_pass http://myapp_mycompany_com;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_intercept_errors on;
    expires -1;
  }

  error_page 500 502 503 504 /500.html;
  error_page 403 /403.html;
  error_page 404 /404.html;

  client_max_body_size 50M;
  keepalive_timeout 10;
}

Puma

$ bundle exec puma -d -e production -b unix:///tmp/myapp.com-puma.sock --pidfile /home/projects/mycompany/myapp.com/shared/tmp/pids/puma.pid
$

access.log 示例

123.123.123.123 - - [11/Jul/2014:05:44:17 +0000] "POST /tasks/easy_task/calculate/ HTTP/1.1" 301 184 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2073.0 Safari/537.36"
123.123.123.123 - - [11/Jul/2014:05:44:17 +0000] "GET /tasks/easy_task/calculate HTTP/1.1" 404 713 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2073.0 Safari/537.36"

...

123.123.123.123 - - [11/Jul/2014:06:04:17 +0000] "POST / HTTP/1.1" 404 713 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2073.0 Safari/537.36"
123.123.123.123 - - [11/Jul/2014:06:04:26 +0000] "POST /tasks HTTP/1.1" 404 713 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2073.0 Safari/537.36"
123.123.123.123 - - [11/Jul/2014:06:04:36 +0000] "POST /tasks/easy_task HTTP/1.1" 404 713 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2073.0 Safari/537.36"
123.123.123.123 - - [11/Jul/2014:06:04:42 +0000] "POST /tasks/easy_task/calculate HTTP/1.1" 200 104 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2073.0 Safari/537.36"

长话短说 如果您想完全重定向到新资源,并且请求的方法和正文不应更改,请使用 308 而不是 301 或 302。

301 是永久重定向,但 302 是临时重定向,因此使用 302 时搜索引擎不会更改与该网站关联的 URL。
301 和 302 指示方法和主体不应更改,但并非所有用户代理都符合这一点。阅读 Mozilla 的解释:

超文本传输​​协议 (HTTP) 302 Found 重定向状态响应代码表示请求的资源已暂时移动到 Location 标头给出的 URL。浏览器重定向到此页面,但搜索引擎不会更新其资源链接(在“SEO 术语”中,据说“链接汁”不会发送到新 URL)。即使规范要求在执行重定向时不得更改方法(和主体),但并非所有用户代理都符合此处 - 您仍然可以在那里找到此类存在缺陷的软件。因此,建议仅将 302 代码设置为 GET 或 HEAD 方法的响应,并使用 307 临时重定向,因为在这种情况下明确禁止方法更改。如果您希望将使用的方法更改为 GET,请改用 303 See Other。当您想要对 PUT 方法做出响应(该响应不是上传的资源而是确认消息(例如:“您已成功上传 XYZ”)时,这非常有用。

308 和 307 都永久重定向到新资源,但它们保证请求正文和方法不会更改。区别在于308是永久的,而307是临时的,因此308将向搜索引擎发出信号以更改网址。看到这个:

307和302唯一的区别是307保证重定向请求时方法和主体不会改变。对于 302,一些旧客户端错误地将方法更改为 GET:使用非 GET 方法和 302 的行为在 Web 上是不可预测的,而使用 307 的行为是可预测的。对于 GET 请求,它们的行为是相同的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

nginx 将 POST 请求重定向到 GET 请求 的相关文章

随机推荐

  • 处理分部类、继承和 Visual Studio 生成代码时,通用接口方法应放在哪里

    考虑这种情况 我们有两个由 Visual Studio 生成的类 例如类型化数据集行 这些类派生自我们无法更改的公共基类 我们无法更改这些子类派生的类 但它们是作为部分类生成的 因此我们可以扩展它们 现在我们决定为这两个类实现一个接口 其中
  • 检测用户何时截屏

    我正在寻找一种方法 让我的应用程序在用户截取屏幕截图时收到通知Command Shift 3 or Command Shift 4 一个例子是 Droplr 和 Cloud App 等应用程序 它们会自动上传截取的屏幕截图 我一直在四处寻找
  • 以编程方式设置自定义 UITabBarItem?

    在 iOS 中 TabBarController 中的 TabBar 属性是只读的 如何将自定义项目与特定视图控制器关联 如何访问 tabBar 内的 UITabBarItems 像这样 CustomView custom CustomVi
  • 如何在 R 中将因子格式转换为数字格式而不更改值? [复制]

    这个问题在这里已经有答案了 下面是数据帧 df1 我想将其中的 V2 列从因子格式转换为数字 而不更改当前值 0 0 8 5 3 df1 V1 V2 V3 X2 X3 4470 2010 03 28 0 A 21 53675 0 4471
  • 用于逐步删除随机项的首选 Scala 集合?

    我有一个需要多次迭代的算法 每次迭代都会对集合中的项目进行评分并删除得分最高的项目 我可以填充一个Vector与初始种群一起 不断将其替换为var 或者选择一个可变集合作为val 哪个可变集合最符合要求 你可以考虑一个DoubleLinke
  • 获取控制器内的环境

    我的一个控制器中有一种情况 只能通过 AJAX 访问 我有以下代码 if request gt isXmlHttpRequest response new Response response gt setContent AJAX reque
  • 如何隐藏UINavigationBar 1px底线

    我有一个应用程序 有时需要其导航栏才能与内容融为一体 有谁知道如何摆脱或改变这个烦人的小条的颜色 在下图中我遇到的情况 我正在谈论 根视图控制器 下方的这条 1px 高度线 对于 iOS 13 Use the shadowColor htt
  • 一次查找多个地方的纬度和经度

    我有一长串城镇和城市列表 我想为每个城镇添加纬度和经度信息 有谁知道一次生成此信息的最简单方法 也可以看看对多个地址进行地理编码 https stackoverflow com questions 396819 geocode multip
  • 使用scale_fill_binned()时如何使用特定的填充颜色?

    我想使用我自己的填充颜色 例如 c red blue grey50 black 使用函数时scale fill binned 在 ggplot 代码中 我怎样才能做到这一点 这是一个最小的可重现示例 library tidyverse da
  • 接受可变数量参数的函数

    在本文档中 https developer apple com library prerelease ios documentation Swift Conceptual Swift Programming Language GuidedT
  • 我可以用 AngularJS 更改 Accept-Language 请求标头吗

    有没有办法更改或编辑我发送到 API 的接受语言标头 javascript Jquery 或 Angular 有没有办法 我不想发送默认的 而是发送我的 Cookie 的 在 AngularJS 中 您可以使用以下方法设置通用标头 http
  • 如何访问 Gradle 使用的“java.home”?

    gradlew properties显示没有具有以下值的属性 JAVA HOME 并且以下发出错误 指示不存在此类属性 println org gradle java home println gradle java home printl
  • 在 Google Chrome 扩展中使用 jQuery.ajax

    我使用 jquery ajax 函数将数据从 google chrome 扩展发布到我的网络服务 代码如下 ajax type POST url serviceUrl data data success function msg if ty
  • 将季度/年份格式转换为日期

    我创建了一个函数 将季度年格式的向量强制转换为日期向量 quarter to date c Q1 13 Q2 14 1 2013 03 01 2014 06 01 这是我的函数的代码 quarter to date lt function
  • 用鼠标拖动滚动

    我正在尝试制作一个可滚动面板 但没有滚动条 并通过用鼠标垂直拖动来滚动 这是到目前为止有人帮助我做的 private void panel1 MouseEnter object sender EventArgs e panel1 AutoS
  • 哪个更快? ByVal 还是 ByRef?

    在 VB NET 中 使用方法参数速度更快 ByVal or ByRef 另外 哪个在运行时消耗更多资源 RAM 我通读了这个问题 https stackoverflow com questions 290189 best practice
  • 多对多 EF7

    Models public partial class Film public int FilmID get set public virtual ICollection
  • 单例模板作为 C++ 中的基类[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 根据C 单例设计模式 https stackoverflow com questions 1008019 c singleton design
  • 通过 Socket.io 更新 React 状态

    我的 React 组件使用来自 socket io 的数据作为状态 我不确定如何在更新数据时更新状态而不重新渲染整个组件 示例代码 var socket io var data components key name markup sock
  • nginx 将 POST 请求重定向到 GET 请求

    我有 Rails 4 1 应用程序运行puma网络服务器 我使用 nginx 作为代理服务器 几天前 一切都进展顺利 我更新了我的应用程序 突然有些POST请求开始重定向到相同的网址 但作为GET要求 我尝试回滚到以前的工作版本 但没有成功