微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ruby-on-rails – Nginx代理重定向到另一个URI

我们的网站是各种图像存储库.每个图像都具有外部URL和内部URL的概念.外部URL由客户端看到,并且随着我们尝试SEO而改变.内部URL是永久URL,指向我们的图像托管服务.我们使用 Ruby on Rails应用程序提供URL转换.以下是请求的示例:

--------           -----     -------     -------          ------------
|      | --eURL--> |   | --> |     | --> |     | -iURL--> |          |
|client|           |CDN|     |Nginx|     | RoR |          |Image Host|
|      | <-------- |   | <-- |     | <-- |     | <-IMG--- |          |
--------           -----     -------     -------          ------------

该架构正在运行,但通过RoR流式传输图像效率很低.我想让Nginx做代理.这就是它的用途.建议的架构看起来像这样:

--------           -----     -------         -------
|      | --eURL--> |   | --> |     | ------> | RoR |
|client|           |CDN|     |Nginx| <-????- |     |
|      | <-------- |   | <-- |     |         -------
--------           -----     |     |         ------------
                             |     | -iURL-> |Image Host|
                             |     | <-IMG-- |          |
                             -------         ------------

我可以向Nginx发送什么样的响应让它代理数据?我不介意将Nginx模块添加到我的基础架构中,当然我可以更改我的Nginx.conf.

X-Sendfile是我发现的最接近的东西,但它只允许从本地文件系统流式传输.也许还有一些我不知道的其他模糊的HTTP响应头或状态代码.

解决方法

x-accel-redirect标头与特殊的Nginx位置结合使用,可以将Nginx代理与远程文件配合使用.

以下是添加Nginx配置的位置:

# Proxy download 
location ~* ^/internal_redirect/(.*?)/(.*) {
  # Do not allow people to mess with this location directly
  # Only internal redirects are allowed
  internal;

  # Location-specific logging
  access_log logs/internal_redirect.access.log main;
  error_log logs/internal_redirect.error.log warn;

  # Extract download url from the request
  set $download_uri $2;
  set $download_host $1;

  # Compose download url
  set $download_url http://$download_host/$download_uri;

  # Set download request headers
  proxy_set_header Host $download_host;
  proxy_set_header Authorization '';

  # The next two lines Could be used if your storage 
  # backend does not support Content-disposition 
  # headers used to specify file name browsers use 
  # when save content to the disk
  proxy_hide_header Content-disposition;
  add_header Content-disposition 'attachment; filename="$args"';

  # Do not touch local disks when proxying 
  # content to clients
  proxy_max_temp_file_size 0;

  # Download the file and send it to client
  proxy_pass $download_url;
}

现在,您只需在对Nginx的响应中设置x-accel-redirect标头:

# This header will ask Nginx to download a file 
# from http://some.site.com/secret/url.ext and send it to user
x-accel-redirect: /internal_redirect/some.site.com/secret/url.ext

# This header will ask Nginx to download a file 
# from http://blah.com/secret/url and send it to user as cool.pdf
x-accel-redirect: /internal_redirect/blah.com/secret/url?cool.pdf

找到了完整的解决方here.我建议在实施之前阅读它.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐