我们正在使用Nginx和我们的Rails应用程序。我们在Rails日志文件中看到请求查找不再存在的资产,例如:
Aug 8 09:18:06 www rails-prod ActionController::RoutingError (No route matches [GET]
"/assets/application-cd8df963daec0c7c81c70254f7549eb028980b5a39df2c2c16fd4e6f9794c4b4.css"):
每次更改css时,网址中的哈希都会更改,因此该资产不再存在是正确的。
Rails服务器不回答资产请求,因为所有资产都是预编译的。我们如何强制Nginx返回404错误?
这是Nginx配置文件:
upstream my_app {
server unix:///var/run/puma/my_app.sock;
}
server {
listen 80;
server_name _ localhost; # need to listen to localhost for worker tier
location / {
proxy_pass http://my_app; # match the name of upstream directive which is defined above
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /assets {
alias /var/app/current/public/assets;
gzip_static on;
gzip on;
expires max;
add_header Cache-Control public;
}
location /public {
alias /var/app/current/public;
gzip_static on;
gzip on;
expires max;
add_header Cache-Control public;
}
}
尝试将break;
添加到location /assets
组,但它没有帮助。还尝试将alias
更改为root
,但这也无效。
答案 0 :(得分:1)
您是否尝试过使用try_files
?它就是这样的(你可以找到并使用其他用法来解决你的特定问题):
location /assets {
try_files $uri @missing
}
location @missing {
return 404;
}
Nginx将尝试提供请求,但如果发现文件丢失,则会返回404。