development, rails, 网络

Rails下解决替换七牛http域至自己的https域

By jere on 2017-02-17 0 Comments

虽然七牛支持https域名,假如你的域名为domain.com,七牛给你的域名不一定是domain.com的子域名,之前遇到过一个问题是当在微信里打开一个页面的时候,如果不是domain.com的文件是不能打开的,所以当时就废弃了https的域名转而使用一个domain.com的子域名,这个子域名的cname再指向七牛的一个域名,但这样就产生了一个问题:在https的模式下大量的使用了http Mix方式,导致自己的网站上面不是一个绿色的对号,而变成一个叹号。

今天晚上就寻思着解决这个问题,首先假设这个URL是http://image.domain.com/uploads/x.image&token=4jfdlsajfkl。先去加一个子域名safe.domain.com,并通过letsencrypt生成一个ssl证书。通过https://safe.domain.com去反向代理http://image.domain.com

以nginx为例:

location / {
    proxy_pass http://image.domain.com;
    proxy_redirect off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

这样尝试通过https://safe.domain.com/uploads/x.image&token=4jfdlsajfkl去访问这个图片,这个是成功的。

然后任务就变成了怎么让七牛的url生成变成safe.domain.com而不是image.domain.com.我这里走了弯路,开始是直接修改了secret文件,把qiniu_protocal和qiniu_bucket_domain直接修改了,后来发现这个是错误的,因为这个就不通过我们的反向代理去代理image.domain.com了。

正确方法是直接加一个简单的方法,把这个url替换掉就行了:

def qiniu_safe_url(url)
    return url unless Rails.env.production?
    url.gsub "http://image.", "https://safe."
end

大功告成!

 

刚刚发现Firefox Safari这样不显示,唉!。

打赏

Leave a comment

您的电子邮箱地址不会被公开。