Nginx + passenger + rails:发布请求时出现405错误

时间:2011-03-24 18:59:42

标签: ruby-on-rails nginx passenger

当我向rails控制器操作调用post请求时,我遇到405错误。 post请求用于获取json文件,get请求提供标准html页面。 问题是html被缓存了。

我在http://millarian.com/programming/ruby-on-rails/nginx-405-not-allowed-error/

上看到了这个问题的解决方案
if ($request_method != GET) {
  proxy_pass http://foobar;
  break;
}

proxy_pass中的url通常是mongrel服务器的url。乘客有类似的解决方案吗?

我是一个完整的nginx新手,试图从apache迁移。

1 个答案:

答案 0 :(得分:2)

我终于找到了解决办法。 我有一组重写条件来处理我的Rails配置使用的缓存目录。

# Check the path + .html
if (-f $document_root/cache/$uri.html) {
  rewrite (.*) /cache/$1.html break;
}

...

即使请求是POST,也会应用这些重写,从而导致405错误。

只有在请求是GET时我才设法应用重写。我不确定它是否是最有效的解决方案,但似乎有效。学习如何处理Nginx中的多个条件是最棘手的部分。 (来源:http://wiki.nginx.org/RewriteMultiCondExample

set $dest "";

if ($request_method = GET) {
    set $dest "/cache";
}
# Check / files with index.html
if (-f $document_root/cache/$uri/index.html) {
  set $dest $dest/$uri/index.html ;
}

# Check the path + .html
if (-f $document_root/cache/$uri.html) {
  set $dest $dest/$uri.html ;
}

# Check directly
if (-f $document_root/cache/$uri) {
  set $dest $dest/$uri ;
}

if ($dest ~* ^/cache/(.*)$) {
    rewrite (.*) $dest break;
}

有更好的解决方案吗?