狂欢管理AJAX请求在开发中工作,404s在生产中

时间:2012-01-26 21:11:30

标签: jquery ruby-on-rails-3.1 nginx passenger spree

我正在使用Spree 0.70.3和Rails 3.1.3构建一个站点。在开发中,我只是在端口3000上运行;在生产中,我们有Passenger 3.0.9和Nginx 1.0.8。

在Spree中将产品与Taxon相关联时,您将进入一个包含空列表的列表的页面。开始输入搜索框会触发AJAX发布请求,以查找与该字符串匹配的分类,并将其显示为产品的潜在分类。

在开发中,这很好用;我可以在开发日志中看到请求,并且页面上会出现分类。在生产中,Chrome控制台显示AJAX请求获得404响应。 Nginx日志只记录404响应; Rails日志显示没有请求的记录。我的猜测是Nginx看到请求有一个.js文件扩展名,并且正在寻找一个文件,可能在public/目录中,而不是将请求发送给Rails。

之前有没有人遇到Spree / Nginx这个问题?如何让Nginx记录有关它如何解决请求的更多数据?有什么关于我应该在这里检查的Nginx配置吗?

ETA:我已经加强了Nginx日志记录,看起来Nginx看起来好像在寻找.js文件作为实际文件而不是将请求交给Passenger和Rails。可以配置吗?

2012/01/27 14:33:17 [error] 4430#0: *2 open() "/var/www/live/current/public/admin/products/<product_slug>/taxons/available.js" failed (2: No such file or directory), client: 64.134.40.51, server: <obfuscated>.com, request: "POST /admin/products/<product_slug>/taxons/available.js HTTP/1.1", host: "<obfuscated>", referrer: "https://<obfuscated>/admin/products/<product_slug>/taxons/selected"

1 个答案:

答案 0 :(得分:0)

解决方案原来是Nginx / Passenger。我发现this mailing list thread表明Nginx配置中的任何location块都需要自己的passenger_enabled on;指令。所以这个块

# "Far-future" expiration dates
location ~* \.(js|css|jpg|jpeg|gif)$ {
    if (-f $request_filename) {
        expires                        max;
        break;
    }
}

需要看起来像这样

# "Far-future" expiration dates
location ~* \.(js|css|jpg|jpeg|gif)$ {
    passenger_enabled on;
    if (-f $request_filename) {
        expires                        max;
        break;
    }
}

解决了这个问题。