小程序内配置带参数的链接会过滤掉参数

2019-06-14  本文已影响0人  CC前端手记

        在开发小程序中遇到这样一个问题,在页面/pages/selected/selected内配置如下wap链接却无法访问,跳转到了404页面。https://m.jiehun.com.cn/hangzhou/renqibang?top_id=667

        读过代码,知道点击这里的链接会跳转到/pages/webhref/webhref页面,再用webview渲染页面。

        首先排除链接本身的问题,结果发现可以正常访问。在selected页面也可以打印原有的正确链接,接下来就要查一查webhref页面的问题了。用抓包工具一看,发现拿到的链接地址换了。https://m.jiehun.com.cn/hangzhou/renqibang?top_id=667被替换成了https://m.jiehun.com.cn/hangzhou/renqibang。也就是说,参数部分?top_id丢失了。

        那就只有两个原因了,一是webhref页面内做了手脚,二是跳转传输过程中丢掉了参数。

        于是我把webhref页面代码翻了一遍,也没发现什么问题,看来多半是跳转过程中的问题喽~接下来看看我们的两条思路:

思路一:

(1)因为会通过options参数传递给目标页面,所以第一步去分析webref中的options参数,发现此时拿到的options如下:

{url: "https://m.jiehun.com.cn/hangzhou/renqibang", top_id: "667"}

小程序把之前的链接地址切割成了url和top_id两部分,如果想正常访问就需要将两部分拼接起来(这里使用了changeparam方法进行参数的拼接)。

if(options.url&&options.url.indexOf('/pages') == -1) {

     // 参数拼接

    varurl = options.url;

    for(varkeyinoptions){

        if(key !=='url'){

    url =this.changeparam(url, key, options[key])

        }

    }

    this.setData({

        url: url

    });

}

changeparam:function(href, name, value){

     varurl = href;

    varnewUrl ="";

    varreg =newRegExp("(^|)"+ name +"=([^&]*)(|$)");

    vartmp = name +"="+ value;

    if(url.match(reg) !=null) {

        newUrl = url.replace(eval(reg), tmp);

    }else{

        if(url.match("[\?]")) {

            newUrl = url +"&"+ tmp;

        }else{

            newUrl = url +"?"+ tmp;

        }

    }

    returnnewUrl;

}

结果依然打不开

(2)难道是select.wxml中navigator的url的问题?

在selected.wxml中给navigator中的image添加事件toAdDetail:

    <navigator class="img-box" wx:if="{{item.content_url}}" url="../webhref/webhref?url={{item.content_url}}">

selected.js中:

    toAdDetail: function(e){

         var originUrl = e.currentTarget.dataset.url;

         // 判断配置链接里是否有?   如果有就把?替换成&

         if(originUrl.indexOf('?')>-1){

             originUrl = originUrl.replace('?', "&")

         }

         wx.navigateTo({

             url: `../webhref/webhref?url=${originUrl}`

         })

    }

这样就保证url中只有一个?了。

但是还有一个问题,在iPhone6s和iPhone7上点击跳转之后,成功展示出对应页面,然后进行了二次跳转进入了404页面……

原来,navigator标签上的url属性还没有去掉,所以发生了两次跳转。

这时,可以打开对应链接了……

不过把这个页面转发出去之后,点击转发链接又到了404……

思路一夭折了……

思路二:

总感觉方案一走的是弯路,是否可以找到根本原因,一招制敌呢?推倒重来!!

怎样解决参数被options拆解的问题呢?

原来,可以使用encodeURIComponent( )函数把url字符串作为 URI 组件进行编码,在获取的时候decodeURIComponent(options.url)就可以了。于是:

(1)select.js文件中:

toAdDetail: function(e){

    this.adsReport(e);

    var originUrl = encodeURIComponent(e.currentTarget.dataset.url);

    wx.navigateTo({

        url: `../webhref/webhref?url=${originUrl}`

    })

}

(2)webhref.js文件中解码:

if (options.url.indexOf('/pages') == -1) {

    // 参数拼接

    var newurl = decodeURIComponent(options.url);

    if(newurl.indexOf('?') == -1){

        this.setData({

            url: newurl + '?uphone=' + uphone + '&uid=' + uid

        })

    }else{

        this.setData({

            url: newurl + '&uphone=' + uphone + '&uid=' + uid

        })

    }

}

然后解决转发后打不开的问题,需要在转发时再次编码:

onShareAppMessage: function (options) {

    return {

        title: '',

        path: '/pages/webhref/webhref?url=' + encodeURIComponent(options.webViewUrl)

    }

}

好,可以正常访问了,哈哈~果然要对症下药,才能少走弯路。

上一篇 下一篇

猜你喜欢

热点阅读