【发布时间】:2012-04-20 19:09:56
【问题描述】:
我已经将我们的 Rails 应用程序设置为通过 send_file 提供文件,并且由于我们不想让我们的应用程序忙于提供文件,因此我们将其通过 X-Accel-Redirect 标头传递给 Nginx。为此,我在我的production.rb 文件中设置了config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect',并像这样设置我的nginx.conf:
# In order to get the site running
# symlink this file to /etc/nginx/sites-enabled/production
upstream unicorn-production {
server unix:/tmp/unicorn.sock fail_timeout=0;
}
server {
listen 3000;
server_name production.localhost;
root /home/deployer/apps/production/current/public;
access_log /var/log/nginx/production_access.log;
rewrite_log on;
try_files $uri/index.html $uri @unicorn;
location ~ ^/downloads/(.*)$ {
internal;
alias /home/deployer/downloads/$1;
}
location @unicorn {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_redirect off;
proxy_pass http://unicorn-production;
proxy_set_header X-Sendfile-Type X-Accel-Redirect;
proxy_set_header X-Accel-Mapping /downloads/=/home/deployer/downloads/;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
}
error_page 500 502 503 504 /500.html;
client_max_body_size 4G;
keepalive_timeout 10;
}
在我的控制器操作中,我执行以下操作:
send_file "/home/deployer/downloads/testfile.foo"
.
这在理论上应该是可行的,但是当我访问 mysite.com/mycontroller/download 时,Chrome 告诉我 Duplicate headers received from server: Error 349 (net::ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION): Multiple Content-Disposition headers received. This is disallowed to protect against HTTP response splitting attacks.
非常感谢任何帮助。
【问题讨论】:
标签: ruby-on-rails google-chrome nginx unicorn