Nginx proxy_pass 然后 try_file

Aug*_*ger 3 ruby-on-rails nginx

我正在设置一个带有 nginx 的 Rails 应用程序。

我想要的是首先检查 URL 是否对 Rails 有意义,然后提供公共文件夹的内容。

我无法做到这一点:

upstream extranet {
  server localhost:3000;
}

server {
  location / {
    try_files @extranet $uri;
    root /var/www/extranet/public;
  }

  location @extranet {
    proxy_pass          http://extranet;
    proxy_read_timeout  90;
    proxy_set_header  Host $host;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  X-Forwarded-Proto $scheme;
    proxy_set_header  X-Forwarded-Ssl on;
    proxy_set_header  X-Forwarded-Port $server_port;
    proxy_set_header  X-Forwarded-Host $host;
    client_max_body_size 100m;
  }
}
Run Code Online (Sandbox Code Playgroud)

我得到:*1 rewrite or internal redirection cycle while internally redirecting to "/"错误。

看起来try_files $uri @extranet;可行,但在我的情况下,首先检查 Rails 应用程序感觉更安全,因为公用文件夹可能会更改。

Ric*_*ith 6

try_files 检查本地文件系统上是否存在文件,并且无法响应来自代理的响应代码。

据推测,如果远程页面不存在,代理响应带有404响应,可以通过error_page语句拦截。

例如:

location / {
    proxy_pass       http://extranet;
    proxy_set_header ...
    proxy_set_header ...
    proxy_set_header ...

    proxy_intercept_errors on;
    error_page 404 = @fallback;
}
location @fallback {
    root /var/www/extranet/public;
    try_files $uri =404;
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅此文档