一个服务器块中的多个HTTP_X_ACCEL_MAPPING

时间:2016-03-16 03:05:05

标签: nginx passenger

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

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

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

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

但那并没有奏效。 谁知道怎么做?

1 个答案:

答案 0 :(得分:0)

根据架子宝石的当前实现,这是不可能的。这是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

正如您所看到的,此代码仅查找第一个'='并假设它是内部路径之前的所有内容,之后的所有内容都是外部路径。