半个月前,我为一个客户做了一个老小程序的初步SEO优化方案。一共花了2天左右,里面有很多细节。这里有两个重要的例子,但它们并不是一个难以改变的优化点。前端优化:重定向后的网址可以直接打开。测试简单,直接打开共享卡即可(请务必测试是否登录,深坑)。这里涉及到两个问题。页面渲染逻辑查询携带的参数组件中的URL问题第一个问题会涉及到后端接口下发的内容,比如这个场景:后端发送一个数据列表,各种原因导致列表包含点击后列表,详情都是要展示的内容,然后分享详情。这种情况基本上是一分享一轰炸。自然,微信小程序的页面爬虫也都是GG。这种情况下,必须前后端一起优化,可以使用一个独立的/x/detail接口,通过id等方法获取details的详细数据,注意分享页的接口设置必须在没有登录的情况下设置。那么怎么把这个id这样的东西带进去,这是第二个问题。有时,由于一些特殊原因,它可能会把上一页的key暂时存放在localStorage中或者直接存放在getApp()实例的内存中,待下一页出来后,再在onLoad中使用这个key。如果你有这个操作或者历史问题,一定要放到下一页的路径下,在查询之后挂载。原因是爬虫不会给你带上一个页面的内存数据,更不会验证本地缓存是否有效。第三个问题也很常见,因为其中一个小程序SEO就是要使用导航器,然后使用导航器,而且很可能导航功能被你封装在了一个组件中,比如卡片组件,这本身就是一个view(记得改成navigator)包含其他元素。在点击操作之前,可能是根据bindtap后组件携带的item计算出的路径,item是父页面获取的界面列表元素。如果出现这种情况,首先将组件的根视图替换成一个navigator,删除bindtap和对应的事件,将item.url(或类似的)写入navigator的url属性,然后在parent所在的地方再获取一个page获取列表第一步是将列表交给map,或者forEach,给列表的元素加上url,这里可以直接进行url的计算。服务端优化:使用页面路径推送能力和提交搜索引擎站长链接地址是一样的,只是小程序的页面路径和query要在这里提交。话不多说,直接参考NodeJS代码即可。functionpushWeixinPages(){//默认起始idletid=0//这里放一个本地文件,保存上次推送的页面id,建议id为数据库自增索引//本地保存是为了服务器重启,这样就不会再来了fs.readFile('./menu\_id',async(error,menu\_id)=>{console.log(error)if(error){//If没有本地日志文件,新建一个fs.writeFileSync('./menu\_id','0')}else{id=menu\_id.toString()//数据存储在pagedatabaseletpush\_sql=\`SELECT\[selector\]FROM\[from\]where\[where\]orderbyid;\`//console.log(push\_sql)//执行数据库语法,请自行封装letret=awaitutil.sqlHandle(push\_sql)//推送的页面数组letpages=\[\]ret.forEach(({id},idx)=>{//将每一项添加到数组中pages.push({path:'/pages/detail/index',query:\`id=${id}\`})//对于最后一项,在本地保存进度IDif(idx===ret.length-1){fs.writeFileSync('./menu\_id',menu.id)}})//获取微信access\_token,请自行封装let{data}=awaitlocal.get('/wx/access\_token')//推送到微信awaitaxios.post(\`https://api.weixin.qq.com/wxa/search/wxaapi\_submitpages?access\_token=${data.access\_token}\`,{pages,})//其他的,如果你愿意,可以做安全判断}})}其他语言可以参考,具体业务的具体逻辑和其他优化方面顺便说一下。.
