一、遇到问题。

        1.1、【外言】前后端分离项目,如果后端直接帮忙加个跨域注解,即可实现我们访问接口的时候,不会出现跨域不允许访问的情况。跨域的时候,如果你用postman测试接口的时候发现能通,说明postman不会出现跨域限制。

        1.2、当跨域需要前端去处理,或者,后端加完注解之后,发现,在项目里仍然出现访问错误或者跨域,可能是访问接口的头部类型未与后端协商好,接口请求发不出去。

如图1-1:

(图1-1)

        当头部内容类型为“ application/json ”的时候,当处理的请求数据不对或者未与后端协商统一类型,出错时,POST请求接口会发送的两次错误请求,第一次应该是 options ,第二次才是你的post,查证资料看到只有响应头为“ application/json ”的时候,请求出错才会有两次错误请求。

如图1-2、1-3、1-4:

(图1-2)

 (图1-3)

 (图1-4)

        把头部内容类型换成“ application/x-www-form-urlencoded ”,请求能发出了,也不会出现两次接口请求发不出的错误提示,但是会提示出现跨域。具体为什么换请求头会如此,就是另一个知识点,可以去查找http请求相关的常见的 POST 提交数据方式。

如图1-5、图1-6:

(图1-5)

(图1-6)

        可以看到,所有的请求响应头都有一个“ Referrer Policy:strict-origin-when-cross-origin ”,可以可以归类为跨域问题。根据我的上一篇文章【uni-app跨域解决方案】即可在uni项目运行中,使用代理解决请求接口出现跨域的问题。还发现一个很奇怪的问题,使用项目内代理解决跨域,也解决了响应头为“application/json ”出现请求错误的问题,我至今未能理解,懂的读者也欢迎指正。

【还有一种可能:引用原文链接:https://blog.csdn.net/jinborui2/article/details/118517252

提交表单发送ajax请求时,chrome请求返回Referrer Policy: strict-origin-when-cross-origin错误,360浏览器返回 引用站点策略:no-referrer-when-downgrade,

出现此类问题主要是因为网站当前访问是使用https,而提交表单或ajax请求却使用的是http,可以归类为跨域问题。只需要将表单或ajax请求由http也修改为https即可。

 这种http和https的跨域问题,还可能导致cookie失效的假象。不仔细观察很难察觉(自己遇到过的坑)从代码上是看不出问题的。】

        1.3、上面说的这些,都归为一个问题,打包发布后,上面这些问题就会出现,因为打包后,项目内的代理跨域就会失效。

二、解决问题。

        2.1、使用 HbuiderX 打包发布项目后,我们试着在本地跑起这个打包项目,需要像服务器一样,安装 nginx 来实现代理,官网下载一个 nginx ,nginx 官网地址:nginx: download,然后把打包后的项目解放进 nginx 下载解压后的 html 文件夹。配置 nginx.conf配置文件。为什么用 nginx ?因为大部分 linux 服务器都会安装 nginx 来运行项目,最后部署到服务器的时候,不是我们配置就是部署人员帮配置,所以我们在配置文件的 server 栏配置上接口地址。

如图2-1:

(图2-1)

        当然,当你这么配置代理的话,那代码的api就只能写尾缀,具体理解查询nginx配置说明。 

如图2-2:

(图2-2)

        重启 nginx ,在浏览器地址栏输入 localhost:8089 进入 nginx 的 index 的欢迎页面,输入localhost:8089/html文件夹目录里的打包文件夹名字/#/ 进入项目index页面,这里端口需要注意,当使用默认的80端口,会出现能运行项目但是访问接口404找不到的情况,建议listen端口必定更换,这里我更换成了8089。


start nginx //运行nginx

tskill nginx //直接杀死进程,在stop、quit命令无效的情况下使用,态度强硬,简单粗暴!

nginx -s reload //重新载入配置文件

netstat -tlnp //查看端口号

 运行项目,成功。解决打包发布后出现跨域的情况。

三、总结

        说了很多,其实就是,项目运行时,使用 HbuiderX 的配置文件内部代理跨域,打包发布后,项目配置的代理跨域就会失效,所以使用nginx 代理跨域。放到服务器的时候,同样配置服务器的 nginx 就行。会有人说那你上面说那么多,不就是废话吗?其实记录自己出现过的错误,你就知道为什么会出现这种错误,也是一种知识不是吗。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐