imfenghuang / blog

some notes
4 stars 0 forks source link

微信安卓版本内置浏览器重定向白屏问题 #14

Open imfenghuang opened 6 years ago

imfenghuang commented 6 years ago

上周有个需求,对 URL query 中指定参数有值的时候,进行一步 set cookie 操作,同时,为保证后面的代码能获取对应的 cookie,需要对当前页面 URL 进行一次重定向。 直接使用 302 重定向,在 iOS 微信中页面跳转正常,但是,在安卓微信中会出现重定向后白屏的问题,需要重新刷新页面才能正常显示。

尝试在前端通过 js 脚本跳转,在安卓微信内置浏览器中也无法正常跳转;

<script>
window.location.href = $url; 
</script>

尝试使用 meta refresh 进行页面跳转也宣告失败;

<meta http-equiv="refresh" content="0; url=$url">

后来通过搜索资料发现,安卓微信内置浏览器对于重定向页面有一定缓存,导致 location.reload() 失效。如果页面 URL 不变,则可能因为缓存原因导致重定向失败,发现这一情况后,重新使用 302 重定向,因为判断 URL query 某个参数有值时,进行写 cookie 操作,之后这个 URL query 参数就没什么作用了,因此,重定向的 URL 可以是当前页面去掉了某具体参数的 URL,之后,再在前端通过 history.replaceState 来调整 URL,让其带上该具体参数即可。

$query = $this->request->query();
$params = $this->arg_filter($params, array('key'));
if(!empty($params['key]) && empty($_COOKIE['key'])){
    // 强制删除参数中的key
    unset($params['key']); 
    // 重新构建url
    $this->redirect('//'.$_SERVER['HTTP_HOST'].$_SERVER['PATH_INFO']."?".http_build_query($params),302);
}

补充:后续会尝试在前端构建不同的 URL 进行跳转,比如给 URL 增加时间戳等;

参考文档:安卓微信浏览器location.reload()刷新无效

tsmazhirong commented 5 years ago

你好,想向你请教下你在iPhone上的302代码是怎么写的呢,我一个应用无论安卓还是iOS,使用302重定向后页面都不会重新刷新,如果你看到了,麻烦解答下,谢谢。

imfenghuang commented 5 years ago

你好,想向你请教下你在iPhone上的302代码是怎么写的呢,我一个应用无论安卓还是iOS,使用302重定向后页面都不会重新刷新,如果你看到了,麻烦解答下,谢谢。

@tsmazhirong php 代码进行的重定向。有进行参数的调整,重新构建url。

bestK commented 3 years ago

经过测试在微信内部浏览器里面 使用ngnix 301 转发到server.domain.com时,必须携带一个无意义的参数 如http://domai.com?= 才能访问,当直接访问 http://domain.com 是无法打开的,头大

tsmazhirong commented 3 years ago

我不懂得写代码,但是你这个问题应该是缓存导致的,因为微信内置浏览器有非常严重的缓存问题,因为没有缓存的话会导致微信的服务器占用很高,所以你每一次新的请求必须带上一个不同的参数,我公司的开发好像在新的请求中会带上一个没有意义的参数在后面,代码怎么实现就不知道了。

发送自 Windows 10 版邮件https://go.microsoft.com/fwlink/?LinkId=550986应用

发件人: ECH2Omailto:notifications@github.com 发送时间: 2020年11月13日 22:45 收件人: imfenghuang/blogmailto:blog@noreply.github.com 抄送: tsmazhirongmailto:tsmazhirong@hotmail.com; Mentionmailto:mention@noreply.github.com 主题: Re: [imfenghuang/blog] 微信安卓版本内置浏览器重定向白屏问题 (#14)

经过测试在微信内部浏览器里面 使用ngnix 301 转发到server.domain.com时,必须携带一个无意义的参数 如http://domai.com?= 才能访问,当直接访问 http://domain.com 是无法打开的,头大

― You are receiving this because you were mentioned. Reply to this email directly, view it on GitHubhttps://github.com/imfenghuang/blog/issues/14#issuecomment-726803721, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AK7PL6ID73CPABKQM4WUWK3SPVA7FANCNFSM4E3GWT3Q.

tsmazhirong commented 3 years ago

但是你这个不应该白屏,就算是缓存问题,你这个url应该是可以正常访问才对的,建议你抓包看看数据包,你这个转发的地址是否会过期呢?

发送自 Windows 10 版邮件https://go.microsoft.com/fwlink/?LinkId=550986应用

发件人: ECH2Omailto:notifications@github.com 发送时间: 2020年11月13日 22:45 收件人: imfenghuang/blogmailto:blog@noreply.github.com 抄送: tsmazhirongmailto:tsmazhirong@hotmail.com; Mentionmailto:mention@noreply.github.com 主题: Re: [imfenghuang/blog] 微信安卓版本内置浏览器重定向白屏问题 (#14)

经过测试在微信内部浏览器里面 使用ngnix 301 转发到server.domain.com时,必须携带一个无意义的参数 如http://domai.com?= 才能访问,当直接访问 http://domain.com 是无法打开的,头大

― You are receiving this because you were mentioned. Reply to this email directly, view it on GitHubhttps://github.com/imfenghuang/blog/issues/14#issuecomment-726803721, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AK7PL6ID73CPABKQM4WUWK3SPVA7FANCNFSM4E3GWT3Q.

bestK commented 3 years ago

浏览器里面是可以访问的,在微信里抓包显示的是

  1. 请求内容 Request:

CONNECT domain.com:443 HTTP/1.1 Host: domain.com User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 13_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.18(0x17001229) NetType/WIFI Language/zh_CN Connection: keep-alive

  1. 响应内容 Response:

(null)

该记录由 Stream 抓取,仅用于分析和学习,可 AppStore 搜索『抓包』下载,面向开发者永久免费使用。

它根本不会执行跳转动作,就像是微信故意截断请求了一样,目前想到个办法就是直接用 html 写个中间页,nginx直接解析到 domain.com 访问到后用 js 转发,domaon.com -> server.domain.com

tsmazhirong commented 3 years ago

好像在微信内置流量器访问要带着cookie,你这个连接是跳转到哪里的服务器呢

发送自 Windows 10 版邮件https://go.microsoft.com/fwlink/?LinkId=550986应用

发件人: ECH2Omailto:notifications@github.com 发送时间: 2020年11月13日 23:02 收件人: imfenghuang/blogmailto:blog@noreply.github.com 抄送: tsmazhirongmailto:tsmazhirong@hotmail.com; Mentionmailto:mention@noreply.github.com 主题: Re: [imfenghuang/blog] 微信安卓版本内置浏览器重定向白屏问题 (#14)

浏览器里面是可以访问的,在微信里抓包显示的是

  1. 请求内容 Request:

CONNECT domain.com:443 HTTP/1.1 Host: domain.com User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 13_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.18(0x17001229) NetType/WIFI Language/zh_CN Connection: keep-alive

  1. 响应内容 Response:

(null)

该记录由 Stream 抓取,仅用于分析和学习,可 AppStore 搜索『抓包』下载,面向开发者永久免费使用。

它根本不会执行跳转动作,就像是微信故意截断请求了一样,目前想到个办法就是直接用 html 写个中间页,domain.com 访问到后用 js 转发,domaon.com -> server.domain.com

― You are receiving this because you were mentioned. Reply to this email directly, view it on GitHubhttps://github.com/imfenghuang/blog/issues/14#issuecomment-726813494, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AK7PL6J2VTPGPYR7FB6WFC3SPVDBBANCNFSM4E3GWT3Q.

bestK commented 3 years ago

微信确实是有很大的缓存问题,不过不是缓存在它的服务端,而是它的客户端上面,它 302301 跳转不过去也应该是因为它的 x5 浏览器内核还有它内部的一套机制,我已经解决了,就是用的我说面上到的方面,我们放弃传统的使用 nginx302 or 301 跳转 (这里把看做不支持301跳转算了), 用 html 作为一个中间页实现 nginx302 301 功能 下面是实现代码

nginx

server
{
    listen 80;
    server_name yourdomian.com;
    index index.php index.html index.htm default.php default.htm default.html;
    root /www/wwwroot/buttonupup.com;
}

html

<html>
    <script type="text/javascript">
         window.location.href = "https://server.yourdomian.com" + window.location.href.split(window.location.origin)[1];
    </script>
</html>
bestK commented 3 years ago

错了 ,真正的原因是两个域名都要 加 https 证书,或者相同协议:poop: