Ruby on rails nginx尝试为.rss/.json本身服务,而不是让rails/unicorn为其服务

Ruby on rails nginx尝试为.rss/.json本身服务,而不是让rails/unicorn为其服务,ruby-on-rails,nginx,unicorn,Ruby On Rails,Nginx,Unicorn,我的rails应用程序在使用nginx和unicorn的生产环境中运行良好,除了一件事: 请求/articles.rss和/articles.json会导致一个404错误,在nginx日志中显示请求的文件不存在。请求,例如,/articles?format=rss有效。因此,看起来.rss使nginx认为这是一个静态文件,而不是动态生成的内容。在开发中(使用rails的内置服务器),这很好 我使用,这是我的站点配置(替换域名): #www到非www重定向--重复内容不好: # https://g

我的rails应用程序在使用nginx和unicorn的生产环境中运行良好,除了一件事: 请求
/articles.rss
/articles.json
会导致一个404错误,在nginx日志中显示请求的文件不存在。请求,例如,
/articles?format=rss
有效。因此,看起来.rss使nginx认为这是一个静态文件,而不是动态生成的内容。在开发中(使用rails的内置服务器),这很好

我使用,这是我的站点配置(替换域名):

#www到非www重定向--重复内容不好:
# https://github.com/h5bp/html5-boilerplate/blob/5370479476dceae7cc3ea105946536d6bc0ee468/.htaccess#L362
#在www和非www之间进行选择,收听“错误的”一个并重定向到
#正确的一个--http://wiki.nginx.org/Pitfalls#Server_Name
上游应用程序{
服务器unix:/var/www/rails cms/shared/tmp/sockets/rails-cms.unicorn.sock fail_timeout=0;
}
服务器{
#不要忘记告诉此服务器侦听哪个端口
听[:]:80;
听80;
#在www主机上收听
服务器名称www。;
#并重定向到非www主机(声明如下)
返回301$scheme://$request\u uri;
}
服务器{
#听[:]:80接受\u filter=httpready;#for FreeBSD
#听80接受\u filter=httpready;\frierbsd
#听[:]:80延迟;#对于Linux
#听80;#Linux版
听[:]:80;
听80;
#要响应的主机名
服务器名称;
#静态文件的路径
root/var/www/rails-cms/current/public;
尝试_files$uri/index.html$uri@app;
位置@app{
proxy\u set\u header X-Forwarded-For$proxy\u add\u X\u Forwarded\u For;
代理集头X-Forwarded-Proto$方案;
代理设置头主机$http\U主机;
代理_重定向关闭;
代理通行证http://app;
}
#指定字符集
字符集utf-8;
#自定义404页
错误\u第404/404.html页;
#包括基本h5bp配置集
包括h5bp/basic.conf;
}

出现这种情况是因为您包括
h5bp/basic.conf
文件,而该文件又包括
h5bp/location/expires.conf
文件。查看后一个文件的内容:

# cache.appcache, your document html and data
location ~* \.(?:manifest|appcache|html?|xml|json)$ {
  expires -1;
  access_log logs/static.log;
}

# Feed
location ~* \.(?:rss|atom)$ {
  expires 1h;
  add_header Cache-Control "public";
}
看到了吗?第一个
位置
截取
.json
请求,第二个位置截取.rss请求,因此您的应用程序永远不会捕获这些请求

如果你想让你的应用程序处理这些请求,你应该完全拒绝
h5bp
,或者干脆把上面提到的
location
s注释掉

当然,在这两种情况下,如果您需要,您的应用程序都应该自行发送缓存头

编辑:


但是由于您的
json
rss
内容是动态生成的,因此我不建议使用缓存头。

谢谢您的回答!对这些部分进行评论是有效的!我以前已经看过了,但是我认为仅仅定义缓存行为不会影响nginx或unicorn是否会提供服务。欢迎!是的,Nignx就是这样工作的。如果某个
位置
捕获到请求,则另一个
位置
在该请求之后无法执行该操作(如果未在第一个位置内声明,即“嵌套”位置)
# cache.appcache, your document html and data
location ~* \.(?:manifest|appcache|html?|xml|json)$ {
  expires -1;
  access_log logs/static.log;
}

# Feed
location ~* \.(?:rss|atom)$ {
  expires 1h;
  add_header Cache-Control "public";
}