微信小程序webview访问的url从https变成http原因排查

1,534 阅读1分钟

昨天在测试小程序的一个功能,小程序存在一个内置的webview页面,测试中,发现访问webview页面变成了http链接, 小程序的域名校验就没通过。

在PC浏览器上单独去访问webview的URL,我发现页面访问有这么一个过程。

页面路径为: www.example.com/webview?abc…

浏览器地址栏经历了以下的变化:

1.  www.example.com/webview?abc…  

2. www.example.com/webview/?ab…

3. www.example.com/webview/?ab…

从2-->3的变化,分析了一下原因,是因为web页面里有一段对http跳转https的代码。这段代码发现当前页面url是http的,就跳转到https的url去。2-->3的变化是web页面代码里发生的。

小程序里导致域名校验不通过,问题处在1-->2的变化中。分析是在nginx里存在重定向跳转导致的。

nginx的配置情况是这样的

server {
    listen 80;
    listen 443 ssl;
    server_name www.example.com;
     ...
    location /webview {
      alias /webview;
      try_files $uri $uri/ /webview/index.html;
    }
}

nginx配置是同时支持http 和https访问的。

当访问 www.example.com/webview?abc…

最开始的  uri找不到,就会重定向去uri 找不到,就会重定向去 uri/ , 这个重定向的时候,是nginx执行的,因为nginx配置同时支持了http和https, 而且http的优先级更高。这就发生了 重定向去 $uri/的时候,url变成了 www.example.com/webview/?ab… 。这就是浏览器地址栏从1-->2的变化过程。

解决方法,具体的配置如下

server {
    listen 80;
    listen 443 ssl;
    server_name www.example.com;

    # 设置相对url重定向
    absolute_redirect off;

     ...
    location /webview {
      alias /webview;
      try_files $uri $uri/ /webview/index.html;
    }
}

这样配置之后,就不再出现https 重定向到http的过程了。

问题解决!