nginx - 一个服务器 block 中有多个 HTTP_X_ACCEL_MAPPING

标签 nginx passenger

正如标题所说,我需要两个 HTTP_X_ACCEL_MAPPING Nginx 中服务器块中的环境变量。

简单地指定两次配置不起作用,因为第二个会覆盖第一个。

这就是我所拥有的(不起作用):

server {
  listen   80;

  root /var/www/mysite/public;
  server_name www.mysite.com;

  passenger_enabled on;
  rails_env production;
  passenger_env_var HTTP_X_ACCEL_MAPPING /var/www/mysite/myfolder/=/loc/;
  passenger_env_var HTTP_X_ACCEL_MAPPING /var/www/mysite/myotherfolder/=/loc2/;
  passenger_pass_header X-Accel-Redirect;

  location /loc {
    root /var/www/mysite/myfolder;
    internal;
  }

  location /loc2 {
    root /var/www/mysite/myfolder;
    internal;
  }

}

只有一个 HTTP_X_ACCEL_MAPPING 一切正常但我无法指定多个。我尝试通过用逗号分隔它们来指定多个值,如下所示:
passenger_env_var HTTP_X_ACCEL_MAPPING /var/www/mysite/myfolder/=/loc/,/var/www/mysite/myotherfolder/=/loc2/;

但这没有用。
任何人都知道如何做到这一点?

最佳答案

2021/01 更新:
根据评论,Rack 现在支持:https://github.com/rack/rack/issues/1387#issuecomment-573355784
原答案:
根据机架 gem 的当前实现,这是不可能的。这是rack 2.0.1 (lib/rack/sendfile.rb)中的代码

def map_accel_path(env, path)
  if mapping = @mappings.find { |internal,_| internal =~ path }
    path.sub(*mapping)
  elsif mapping = env['HTTP_X_ACCEL_MAPPING']
    internal, external = mapping.split('=', 2).map(&:strip)
    path.sub(/^#{internal}/i, external)
  end
end
如您所见,此代码仅查找第一个 '=' 并假设它之前的所有内容都是内部路径,之后的所有内容都是外部路径。

关于nginx - 一个服务器 block 中有多个 HTTP_X_ACCEL_MAPPING,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36026098/

相关文章:

ruby-on-rails - 带有乘客的 Controller 中的 Binding.pry

node.js - Nginx letsencrypt 配置慢

ruby-on-rails - 托管帮助 - DreamHost 上的自定义 Gems

swift - PFFile 返回不正确的图像 URL

node.js - Nginx HTTPS 失败,但 node.js https 有效

php - 使用 Passenger 与 PHP 应用程序一起运行 Rails 应用程序

ruby-on-rails - 使用带有 nginx 的 phusion 乘客 3.0.17 运行多个 Rails 网站

ruby-on-rails - 如何在 Rails 4 应用程序上设置 SSL? (nginx + 乘客)

node.js - 运行 nginx 来提供文件并充当同一域上 Node 应用程序的反向代理

php - Amazon Linux 上的多个 PHP-FPM 版本加载相同的配置