这是我参与「第四届青训营 」笔记创作活动的第3天
前言
在本次青训营活动中,我们组选择的项目是仿掘金官网。其中,横跨在前后端之间的有一座大桥——“CORS”(跨源资源共享)。
什么是CORS呢?MDN上这样说:
跨源资源共享
(CORS)(或通俗地译为跨域资源共享)是一种基于 HTTP 头的机制,该机制通过允许服务器标示除了它自己以外的其它 origin(域,协议和端口),使得浏览器允许这些 origin 访问加载自己的资源。
为什么用“一座大桥”来形容呢?这是因为出于安全性,浏览器限制脚本内发起的跨源 HTTP 请求。譬如如果运行在 https://domain-a.com
的 JavaScript 代码使用 XMLHttpRequest
来发起一个到 https://domain-b.com/data.json
的请求的话,除非响应报文中的header
包含了正确 CORS 响应头,否则会因为安全问题无法访问。
具体应该包含哪些header
头呢?请参见跨源资源共享(CORS) - HTTP | MDN (mozilla.org)
解决的方案也很简单,只要让服务器后端返回来的请求都带上这些header
头即可。下面分享如何在宝塔面板中配置反代并解决跨域问题。
配置反代
假设:服务器上的8088端口运行着后端服务,但是我想把这个8088端口隐藏起来,通过服务器80端口来访问服务,这个时候就可以使用反代解决。
注:下面的演示部分使用宝塔面板英文版
aaPanel
进行,对应的位置其实和宝塔面板都是一样的~
第一步:打开宝塔面板,左边栏网站->添加站点
第二步:在添加站点页面根据需要输入自己的域名/IP等
第三步:点击新建站点的设置
按钮
第四步:点击反代标签,并添加反代
第五步:根据需要设置反代配置,这里我需要反代本地的8088端口,所以目标url填写http://127.0.0.1:8088
至此反代已经配置完毕。
在反代的基础上配置CORS
假设:服务器上装的是Nginx
首先,我们需要大致了解Nginx配置文件的结构:
(这里安利下大佬的Nginx一小时入门教程,常用的配置里面都有啦~nginx一小时精讲课程 · 语雀 (yuque.com))
http {
server{#虚拟主机
listen 8000;
server_name localhost:
location / {
root /home/html/wwwroot;
}
}
}
通常的Nginx配置文件分为3大段:http
>server
>location
每一个server
代表一个虚拟主机,其下的listen
规定了监听端口,server_name
(简单来说)会和绑定的域名进行匹配;
location
会匹配访问目录,访问其内部规定的资源。
所以我们接下来要找到反代对应的配置文件藏在了哪里,然后在其对应的location
中加入配置文件。
点击左边栏网站
,打开对应站点的设置
点击配置文件
,出现下图所示的代码框。在其中寻找其所include的设置反代的文件。
我这里是/www/server/panel/vhost/nginx/proxy/域名/*.conf
接下来找到这个文件,双击打开它:
可以看到确实是在这个配置文件中的location
里面设置了反代:
我们在整个location
的末尾,但是}
之前,加入如下的配置:
set $enable_cors 0;
if ( $enable_cors = 0 )
{
#CORS 配置
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';
#是否允许cookie传输
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Headers' 'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,X-Data-Type,X-Requested-With,X-Data-Type,X-Auth-Token';
}
#针对浏览器的options预请求直接返回200,否则会被403 forbidden--invalie CORS request
if ( $request_method = 'OPTIONS' ) {
#CORS 配置
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';
#是否允许cookie传输
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Headers' 'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,X-Data-Type,X-Requested-With,X-Data-Type,X-Auth-Token';
return 200;
}
然后按Ctrl+S保存一下~
笔者目前用的这个版本的宝塔还算挺智能,保存后会自动重启Nginx。如果发现配置文件不生效,有可能是没有重启Nginx的原因。
重启方式:
希望对大家有所帮助^_^,如有不足请指出