Rails Rails + Nginx 下 HTTP 和 HTTPS 同时访问并实现特定方法自动转换

kooglezhang · 2016年12月26日 · 最后由 hiveer 回复于 2021年02月05日 · 2839 次阅读

最近一直在这个问题上纠结并痛苦,总是没有达到理想的状态,网站在 HTTPS 和 HTTP 之间飘忽,而不是我所设想的只在某一个方法下去自动转换,

终于在一番痛苦的测试频繁发版后,今天在一阵激动之中终于把这个逻辑按照自己设想的状况下实现,虽然辛苦,但却也在收获中成长,

真的是笑出了声,:D

现在把我的解决思路和遇到的问题陈述,希望可以帮到更多的朋友,以后遇到类似的问题可以作为借鉴参考

网站从 HTTP 升级为 HTTPS,升级的原因是因为个人喜欢看着地址栏那个大绿色的 https://

因为开发的过程中都是使用的相对路径,所以从 首页跳转到播放页的时候链接都是 https://,导致播放页无法正常播放视频内容, (这个时候真的羡慕 YouTube 的视频资源全源 https://)

后来通过https://ruby-china.org/topics/31988 在 Nginx 里添加多个 if 条件判断初步实现了从 https 在特定方法下转为 http,但是金接着第二未知问题来了,

那就是因为只指定的特定路径,而像样式文件 css , js 等引用文件,导致了在请求时报错,access-control-allow-origin

然后只是快乐就停留在这个报错的时候,然后又想到在所有请求到播放页的链接全都绝对链接 http://example.com/show, 这个后来仍然被否决掉了,

因为在播放页的其他相对路径会被污染为 http,如用户登录,注册等相关的链接,而我想他们都是 https,

后来找到解决 force_ssl 这个特定方法强制 https 访问,在本地开发测试的时候一切正常,部署到线上后,提示网页有多重定向,无法正常访问

class WelcomeController < ApplicationController
   force_ssl, except: [:show], if: :run_production?

   def run_production?
       Rails.env.prodcution?
   end

end

后来找了原因,是因为 nginx 在作为代理服务器的时候,从浏览器到实际 rails 执行后的 scheme 不匹配,导致了方法死循环(这是我今天个人的理解,不对之处请朋友们能指正)

解决的方法是在 nginx 配置里加上一个

proxy_set_header X-Forwarded-Proto $scheme;

即告诉 nginx 我服务器返回的是什么 scheme 就代理为什么,不做处理,

至此,网站终于按照我刚开始所预料的那样运行:D!!! 体验飞机票

请问下楼主可否知道:$scheme$http_x_forward_proto 有啥差别吗?

需要 登录 后方可回复, 如果你还没有账号请 注册新账号