为rails安全静态内容交付设置nginx X-Accel-Mapping

时间:2013-01-12 21:07:17

标签: ruby-on-rails nginx

我正试图通过nginx&提供静态内容使用X-Accel-Redirect的导轨。我的实际静态内容目录位于rails根文件夹中,如此

  - "rails_root\books\sources\:book_id\remaining_path".

只有rails_root\books\sources是常数,剩下的部分总是在变化。前

  -app\books\sources\111\oep\cover.html
  -app\books\sources\111\oep\images\xx.png

我尝试使用以下配置设置nginx

    location ~ /readbook/*./.* {
      internal;
      alias /home/vooodoo/work/reader/books/sources/$1/$2;
    }

    location / {
      proxy_redirect    off;

      proxy_set_header  Host              $http_host;
      proxy_set_header  X-Real-IP         $remote_addr;
      proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;

       proxy_set_header  X-Sendfile-Type   X-Accel-Redirect;
      proxy_set_header  X-Accel-Mapping   /readbook/=/home/vooodoo/work/reader/books/sources/;

      proxy_pass http://127.0.0.1:3001/;
    }

它成功检测到请求并将其传递给rails。在轨道上我正在做什么

 class ReaderController < ApplicationController
        def resource
           send_file "#{Rails.root}/books/sources/"+ params[:id] + "/" + params[:resource] + "." + params[:format]
        end
 end

它将文件信息返回给nginx,但似乎rails不理解我的配置的X-Accel-Mapping。因此,当nginx尝试读取文件时,会发生此错误

  

ActionController :: RoutingError(没有路由匹配[GET]   “/home/voodoo/work/reader/books/sources/229/OPS/cover.xml”):

我坚信这是incorrect X-Accel-Mapping in nginx所致。但是无法弄清楚是什么。有人可以帮我吗。最近几个小时我很震惊。

2 个答案:

答案 0 :(得分:0)

我相信/readbook=/...应为...=/readbook/

答案 1 :(得分:0)

您的X-Accel-Mapping配置错误,请尝试以下操作:

location ~ /readbook/*./.* {
  internal
  alias /home/vooodoo/work/reader/books/sources/$1/$2;
}

location / {
  ...
  proxy_set_header X-Sendfile-Type X-Accel-Redirect;
  proxy_set_header X-Accel-Mapping /home/vooodoo/work/reader/books/sources/=/readbook/;
  ...
}