Ruby on rails nginx重定向POST请求以获取请求

Ruby on rails nginx重定向POST请求以获取请求,ruby-on-rails,nginx,rest-client,puma,Ruby On Rails,Nginx,Rest Client,Puma,我有运行在pumaweb服务器上的Rails 4.1应用程序。我使用nginx作为代理服务器。几天前一切都很顺利。我更新了我的应用程序,突然一些POST请求开始重定向到相同的url,但作为GET请求。我尝试回滚到以前的工作版本,但没有成功 我发现自己的行为很有趣。我用curl测试了我的API 如果我向url发送了请求 http://myapp.com/tasks/easy_task/calculate/它重定向到同一个url 但作为GET请求 然后我向POSTrequest发送了http://

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

我发现自己的行为很有趣。我用
curl
测试了我的API

  • 如果我向url发送了
    请求
    
    http://myapp.com/tasks/easy_task/calculate/
    它重定向到同一个url 但作为
    GET
    请求
  • 然后我向
    POST
    request发送了
    http://myapp.com/
    ,返回404
  • 然后我向
    POST
    request发送了
    http://myapp.com/tasks
    ,返回404
  • 然后我向
    POST
    request发送了
    http://myapp.com/tasks/easy_task
    ,返回404
  • 然后我向
    POST
    request发送了
    http://myapp.com/tasks/easy_task/calculate
    ,返回200。耶
当我使用chrome的app
Postman
时也发生了同样的事情。首先,它重定向了,但在前面的步骤之后,它工作得很好

我在其他应用程序中使用此应用程序。我使用
RestClient
发出http请求。当我尝试发出
POST
请求时,它会引发异常
RestClient::MovedPermanently(301永久移动)

  • 我将
    nginx
    重新安装到
    1.7.3
  • 重新启动的服务器(虚拟机)
  • 重新部署我的应用程序,部署以前的版本
  • 没有成功:(
我在stackoverflow上发现了类似的问题,但没有一个给了我解决此问题的线索。希望您能帮助我解决此问题。提前感谢

类似问题: - -

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;
}
美洲狮

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"

我找到了解决办法。当我发出
POST
request时,我使用了以斜杠结尾的url,比如
http://myapp.com/tasks/easy_task/calculate/

当我最后使用url时没有斜杠,比如
http://myapp.com/tasks/easy_task/calculate
一切都很完美

我想这是因为这个规则

rewrite ^/(.*)/$ /$1 permanent; # Truncate trailing slashes

明天我就要结束这个问题了。

我找到了解决方案。当我发布请求时,我使用了以斜杠结尾的url,比如
http://myapp.com/tasks/easy_task/calculate/

当我最后使用url时没有斜杠,比如
http://myapp.com/tasks/easy_task/calculate
一切都很完美

我想这是因为这个规则

rewrite ^/(.*)/$ /$1 permanent; # Truncate trailing slashes

我将于明天结束本期。301是永久重定向,但302是临时重定向,因此使用302时搜索引擎不会更改与该网站关联的URL。
301和302指示的方法和正文不应更改,但并非所有用户代理都与此一致。请阅读Mozilla的以下说明:

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

308和307都永久重定向到新资源,但它们保证不会更改请求的主体和方法。不同之处在于308是永久的,307是临时的,因此308将向搜索引擎发出更改URL的信号。请参见以下内容:

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

博士
若你们想完全重定向到一个新的资源、方法和请求主体,不应该改变使用308而不是301或302。

301是永久重定向,但302是临时重定向,所以当使用302时,搜索引擎不会改变和该网站相关联的URL。
301和302指示的方法和正文不应更改,但并非所有用户代理都与此一致。请阅读Mozilla的以下说明:

超文本传输协议(HTTP)302找到重定向状态响应代码表示请求的资源已临时移动到位置标头给定的URL。浏览器重定向到此页面,但搜索引擎不更新其到资源的链接(在“SEO演讲”中,据说“链接果汁”不会发送到新的URL)。即使规范要求方法(和正文)在执行重定向时不进行更改,并非所有用户代理都符合此处的要求-您仍然可以在那里找到此类有缺陷的软件。因此,建议仅将302代码设置为GET或HEAD方法的响应,并改为使用307临时重定向,因为在这种情况下,明确禁止更改方法。在如果您希望更改用于获取的方法,请改用303 See Other。这在您希望对已更改的PUT方法给出响应时非常有用
location /dc1 {
    proxy_pass http://localhost:8000;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Host www.example.com;
}