当服务器也开始“社恐”
大家好,我是你们的服务器测评博主,今天咱们聊点“人际交往”问题——不过主角是服务器。你有没有遇到过这种情况:前端小哥写了个超帅的页面,结果浏览器一打开就报错:“跨域请求被阻止!”(CORS error)。这时候你可能会懵:“我明明只用一个服务器啊,咋还‘跨域’了?”别急,今天我们就用“人类社交”的视角,把跨域问题扒个底朝天!
想象一下:你(前端页面)住在“北京小区”(域名`a.com`),想去隔壁“上海小区”(域名`b.com`)串门。结果保安(浏览器)一把拦住:“不行!你没登记!”——这就是跨域。
专业点说:当你的网页(`http://a.com/index.html`)试图通过AJAX请求另一个域名(比如`http://b.com/api`)的资源时,浏览器会严格检查两者的协议、域名、端口是否一致。只要有一个不同(比如从`http`到`https`,或端口从80变成8080),就算“跨域”。
举个栗子🌰:
- 同源(允许访问):
`http://a.com/index.html` → `http://a.com/api`
- 跨域(被浏览器拦截):
`http://a.com/index.html` → `https://a.com/api` (协议不同)
`http://a.com:80/index.html` → `http://a.com:8080/api` (端口不同)
如果你的整个网站(前端+后端API)都部署在同一台服务器的同一个域名下(比如全放在Nginx的`/var/www/html`里),端口也一致,那基本不会触发跨域。就像你在自家客厅溜达,没人拦你。
但现实往往更狗血!比如:
- 端口不同:前端跑在80端口,后端API跑在3000端口→跨域!
- 协议不同:HTTP页面请求HTTPS接口→跨域!(浏览器会认为这是两个世界)
- 反向代理配置翻车:Nginx/Apache没配好代理路径,导致请求被重定向到其他域名→跨域!
真实案例💡:
某程序员小张用Node.js写了个API服务(跑在`http://localhost:3000`),但前端页面用Vue开发(跑在`http://localhost:8080`)。虽然都在本地,但端口不同——浏览器直接无情拒绝:“你们不是一个圈的!”
既然浏览器这么严格,我们怎么让服务器“学会社交”?下面是几种常见方案:
后端在响应头里加一句:“这哥们我认识!”(其实就是设置Header):
```bash
Access-Control-Allow-Origin: http://a.com
Access-Control-Allow-Origin: *
```
适用场景:正经项目首选,安全性高。
通过Nginx把不同端口的请求统一代理到同源下:
```nginx
location /api {
proxy_pass http://localhost:3000;
}
这样前端只需访问同源的`/api`路径,完美绕过浏览器检查。
利用`