ruby-on-rails – Nginx代理重定向到另一个URI
发布时间:2020-12-17 02:20:11 所属栏目:百科 来源:网络整理
导读:我们的网站是各种图像存储库.每个图像都具有外部URL和内部URL的概念.外部URL由客户端看到,并且随着我们尝试SEO而改变.内部URL是永久URL,指向我们的图像托管服务.我们使用 Ruby on Rails应用程序提供URL转换.以下是请求的示例: -------- ----- ------- -----
我们的网站是各种图像存储库.每个图像都具有外部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.我建议在实施之前阅读它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |