Socket.IO 客户端重连:从无限循环到稳定连接的踩坑记录
分享 Socket.IO 自动重连的参数配置、常见坑和手动控制方案,帮你避开线上事故。
支持通配符SSL证书、多域名证书、IP证书。适配ACME接口, 支持Zerossl、Let's Encrypt和Google等渠道。登录已有账号
2026-07-21 13:15:38 前端 跨域 CORS JSONP Nginx
跨域这回事,前端做得越久碰到的次数越多。
浏览器同源策略卡在那里,协议、域名、端口有任何一个不一样,请求就发不出去。下面把 CORS、JSONP 和 Nginx 反向代理这三条路分别理一遍,顺带说一些线上容易踩的坑。
先说 CORS,现在处理跨域的大头基本都是它。
原理不复杂,就是服务端在响应头里加上 Access-Control-Allow-Origin,告诉浏览器哪些源可以访问。不过这里面细节不少,比如简单请求和复杂请求的区别。GET、HEAD 以及部分 POST(Content-Type 是表单那几种)会被当作简单请求直接发出去;一旦用了 PUT、DELETE 或者自定义头,浏览器就会先发一个 OPTIONS 预检请求,服务端得正确响应这个 OPTIONS,否则真正的请求根本不会发出去。
Node.js 里用 cors 中间件配置一下就能跑起来,一个典型的配置长这样:
const express = require('express'); const cors = require('cors'); const app = express();
const corsOptions = { origin: 'http://your-frontend-domain.com', methods: 'GET,HEAD,PUT,PATCH,POST,DELETE', allowedHeaders: ['Content-Type', 'Authorization'], credentials: true, };
app.use(cors(corsOptions));
如果需要带 Cookie,前端 xhr 或者 fetch 得设置 withCredentials 为 true,同时服务端 Access-Control-Allow-Credentials 也要设为 true,并且 Origin 不能配成 *,必须指定具体域名,不然浏览器还是会拦截。
再来说 JSONP。
这东西在 IE 时代用得很多,现在基本只会在老项目或者一些特殊对接场景里见到了。它利用的是 script 标签不受同源策略限制的特点,动态往页面里插一个 script,src 指向接口地址并带上回调函数名,服务端返回一段 JS 代码,直接调用那个回调并把数据塞进去。
前端可以这么干:
function handleResponse(data) { console.log('Received:', data); }
const script = document.createElement('script'); script.src = 'https://api.other-domain.com/data?callback=handleResponse'; document.body.appendChild(script);
服务端返回的内容大致就是 handleResponse({ "status": "success", "data": [...] })。
JSONP 的硬伤也很明显:只支持 GET,没办法处理错误状态码,而且安全问题比较棘手,容易 XSS。如果没有特殊兼容需求,新项目基本不会再考虑它了。
然后是 Nginx 反向代理。很多时候跨域问题不是因为前后端分离得有多彻底,而是开发环境里前端直接调了不同域名的后端接口。
这种情况下让 Nginx 在前面挡一层,把同域下的 /api 路径代理到真实服务上,浏览器只跟一个源打交道,跨域自然就不存在了。
一段简单的 Nginx 配置:
server { listen 80; server_name my-domain.com; location /api/ { proxy_pass https://api.other-domain.com/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; add_header 'Access-Control-Allow-Origin' 'http://your-frontend-domain.com'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'Content-Type'; } }
这里的 add_header 顺便加上了 CORS 头,这样即使后端没处理,Nginx 层也能兜底。不过要留个心,如果后端也设置了 CORS 头,可能会重复,有些情况会导致浏览器报错。实际用的时候可以先确认后端是否会返回这些头,再决定 Nginx 侧要不要加。
三种方案的选型其实没那么复杂。CORS 是标准做法,前后端都方便,绝大多数 API 接口跨域用它就行,但要严格限制 Origin,别图省事写成 *。JSONP 基本只用来兼容个别老旧浏览器,或者偶尔处理那些完全没法配置服务端的第三方接口,前提是能接受它的安全隐患。
Nginx 代理适合前端不想或者不能改动代码的部署场景,多一次代理会稍微增加一点服务器开销,维护代理规则也得跟上。
线上配置的时候,还有几个容易忽略的点。
安全方面,CORS 的 Access-Control-Allow-Origin 千万不要配 *,老老实实写成可信域名;如果用 JSONP,最好加上 CSRF Token 校验,哪怕只是简单验证一下 Referer 也行。
性能上,预检请求一旦多了,页面加载会明显变慢。可以设置 Access-Control-Max-Age 来缓存预检结果,减少重复的 OPTIONS 请求。
另外,通过 Nginx 开启 gzip 或 brotli 压缩代理返回的数据,也能提升传输速度。
异常监控同样不能省。
前端可以统一捕获跨域错误上报,看到类似 “blocked by CORS policy” 的报错马上能定位到问题。Nginx 的访问日志和错误日志是查代理问题的第一手资料,建议保持开启。服务端那边,如果 OPTIONS 请求量异常增高,多半是哪里配置不对或者有人在做试探,及时排查就好。
这些方案本身都不难,但要在生产环境里用得稳,靠的还是对同源策略的理解和对细节的把控。
上一篇: PNPM 版本管理:查看、升级与路径确认
分享 Socket.IO 自动重连的参数配置、常见坑和手动控制方案,帮你避开线上事故。
本文系统讲解Nginx配置SSL证书实现HTTPS访问的全流程,涵盖证书获取、配置优化及验证测试,确保网站安全。
Nginx配置SSL证书实现HTTPS访问的全流程,包括证书获取方式、核心配置参数、服务重载方法及验证测试手段。通过配置ssl_protocols和ssl_ciphers等关键参数,可有效提升通信安全性。特别强调了HTTP到HTTPS的重定向配置和常见问题处理方案,如证书路径错误和端口冲突的解决方法。该方案适用于生产环境和测试环境,能有效保障Web服务的数据传输安全。
使用OpenSSL为Nginx生成SSL证书的完整流程,涵盖RSA私钥生成、CSR创建、自签名证书生成等基础步骤,以及ECC证书、多域名证书等高级场景。通过配置文件示例和命令行操作说明,系统展示了证书在Nginx中的集成方式,并强调了私钥保护、协议优化等安全要点。对于生产环境,建议采用CA签发证书并配合自动化更新机制,以平衡安全性和运维效率。
在Linux服务器上部署SSL证书的全流程,包括证书准备、端口开放、Web服务器配置及验证等关键步骤。通过Nginx和Apache两种主流服务器的配置示例,展示了如何启用HTTPS加密通信。文中还提供了证书自动续期、常见问题处理等实用技巧,帮助管理员高效完成证书部署与管理。遵循指南,可显著提升Web服务的安全性,避免数据泄露风险。