测试环境协议是HTTP,正式环境协议是HTTPS,怎么共存这两者?

102 阅读1分钟

我最近做项目的时候,遇到了一个问题,前端打包出来的静态资源用HTTP访问,协议却自动转成了HTTPS,真是百思不得其解。经过不断地排查,才发现我之前解决一个bug的时候,在index.html加上了一个meta标签,

<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">

这个标签是为了解决,iframe嵌入的页面,使用HTTP接口引起的mix content blocked的问题。

当然这个属性很好用,还可以帮助防止跨站脚本攻击(Cross-Site Script)(XSS (en-US))。只是一刀切升级为HTTPS会影响到测试环境,尤其是后端在本地起服务的情况。就像这次后端小哥哥找我解惑一样,打测试包和正式包区分meta标签的需求非常重要,我首先想到了利用webpack的配置达到目标。

我的项目是经典祖传代码,使用的是Vue2+webpack4的组合,通过查阅官方文档,我找到了关于meta标签的设置

plugins: [
  new HtmlWebpackPlugin({
    'meta': {
      'Content-Security-Policy': { 'http-equiv': 'Content-Security-Policy', 'content': 'default-src https:' },
      // Will generate: <meta http-equiv="Content-Security-Policy" content="default-src https:">
      // Which equals to the following http header: `Content-Security-Policy: default-src https:`
      'set-cookie': { 'http-equiv': 'set-cookie', content: 'name=value; expires=date; path=url' },
      // Will generate: <meta http-equiv="set-cookie" content="value; expires=date; path=url">
      // Which equals to the following http header: `set-cookie: value; expires=date; path=url`
    }
  })
]

结合我项目的.env文件,可以得出这样一个简单的配置

plugins: [
  new HtmlWebpackPlugin({
    'meta': process.env.VUE_APP_ENV == 'PRO' ? {
      'Content-Security-Policy': { 'http-equiv': 'Content-Security-Policy', 'content': 'upgrade-insecure-requests' }
    } : {}
  })
]

通过webpack的配置,下次打测试包我就不用手动处理meta标签了,感谢webpack🙏