【问题标题】:Nginx proxy_pass then try_fileNginx proxy_pass 然后 try_file
【发布时间】:2017-12-13 19:31:11
【问题描述】:

我正在设置一个前面有 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;
  }
}

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

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

【问题讨论】:

    标签: ruby-on-rails nginx


    【解决方案1】:

    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;
    }
    

    请参阅this document 了解更多信息。

    【讨论】:

    • 正是我想要的!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-10-10
    • 2016-03-10
    • 2018-03-29
    • 2019-01-22
    • 2013-07-15
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多