2011-03-24 101 views
2

我在向rails控制器操作发送post请求时遇到了405错误。 发布请求用于获取json文件,只要get请求提供标准html页面。 问题是,HTML被缓存。Nginx + passenger + rails:在发布请求时获取405错误

我已经看到了这个问题的解决方案上http://millarian.com/programming/ruby-on-rails/nginx-405-not-allowed-error/

if ($request_method != GET) { 
    proxy_pass http://foobar; 
    break; 
} 

在proxy_pass的URL是针对杂种服务器正常的URL。乘客是否有类似的解决方案?

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

+0

你实际上是用POST请求发布数据还是仅仅用它来区分JSON和HTML请求?如果是这样,有一个更好的方法来完成你正在做的事情。 – 2011-03-24 19:25:23

+0

我想让rails服务于json resquet而不是nginx返回405错误。 – jlfenaux 2011-03-24 19:36:29

+0

是的,我正在发送一个帖子请求。当我关闭页面缓存时,它运行良好。 – jlfenaux 2011-03-24 19:45:11

回答

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; 
} 

有没有更好的解决方案?

相关问题