Nginx转发:http请求被浏览器强制转为https的解决方案

·Nginx ·CDN

用Gin搭了个web服务。软件下载二级站点:我的软件,配置了ssl证书,从而实现HTTPS的加密协议。

但当我访问网址的时候,有些静态资源图片加载不出来。因为一些静态文件我用七牛云的cdn免费存储。因为我的域名apps.reminisce.top开启了ssl,七牛云cdn是http。浏览器现在不允许https的站点混合http请求,导致Http请求浏览器会强制变成Https。而七牛云cdn源站就是http,因此报错。

那么怎么解决呢?有以下四种:

  • 把我的apps域名降级成http,也就是不配置ssl
  • 七牛云cdn源站配置https
  • 利用nginx做中转
  • 把这些静态资源转存到自己的域名服务器,链接改为自己的服务器资源地址
我一开始很本能地想到去七牛云配置https,但我看到七牛云cdn配置https没有免费的10GB,我就放弃了。所以采用nginx做中转,照样能使用七牛云的cdn。

怎么做代理中转给cdn呢,直接上nginx配置代码:、
server {
  listen 443 ssl;
	server_name apps.reminisce.top;
  ssl_certificate   xxxx.crt;
  ssl_certificate_key  xxxx.key;
  # ....一些配置

  root xxxxx;
 	# 将以 "/cdnqiniu" 开头的任何静态资源地址转发到http://xxx.xxx.com,
	# 并保留原始的 URI 路径,但不要包括"/cdnqiniu"部分
	# --因为开启了ssl,七牛云cdn是http,Http请求浏览器会强制变成Https
	location ^~ /cdnqiniu {
	   # backendIP可让浏览器响应标头显示真实请求ip
	   # add_header backendIP $upstream_addr;
        rewrite ^/cdnqiniu(.*) $1 break;
        proxy_pass http://xxx.xxx.com;
    }
	# 正常转发 gin
	location / {
    proxy_pass         http://xxx:999999999999999999;
    proxy_http_version 1.1;
    # ....一些配置
	}
}
从配置上就可以看出内容了。首先443端口监听域名,当然我的80端口也监听了重定向到443而已,只不过没写出来。然后location ^~ /cdnqiniu表示开始精确正则匹配,匹配以/cdnqiniu为开头的uri。我把那些需要cdn的静态资源地址开头都定义成/cdnqiniu,这样在nginx这边就能统一匹配到这些静态资源的请求,然后进行转发。

然后rewrite块,将^/cdnqiniu(.*)进行正则匹配,并且(.*)是匹配到的第一组,这个第一组也就是$1的值,也就是说,/cdnqiniu/img/1.jpg这样的资源,$1将会获取到/img/1.jpg,并且去除了开头的/cdnqiniu。然后proxy_pass头将转给七牛云cdn源站http://xxx.xxx.com处理,并且最终的静态资源转发地址将变成诸如:http://xxx.xxx.com/img/1.jpg,从而实现了转发,节省了带宽。

最后location /匹配任何除了/cdnqiniu开头的url,这个就不用说了。

来自:计算机系统与软件工具
更新于2023-08-31 22:35:21 发表于2023-08-31 22:30:45


发表您的评论





公元2024年甲辰龍年,平安健康、龍行天下!