强制nginx返回404以查找丢失的资产

时间:2015-08-10 03:35:21

标签: ruby-on-rails nginx puma

我们正在使用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,但这也无效。

1 个答案:

答案 0 :(得分:1)

您是否尝试过使用try_files?它就是这样的(你可以找到并使用其他用法来解决你的特定问题):

  location /assets {
    try_files $uri @missing
  }

  location @missing {
    return 404;
  }

Nginx将尝试提供请求,但如果发现文件丢失,则会返回404。