在 Vercel 上实现 HTTP 协议的反向代理需要注意以下技术细节(以 Google 地图 API 反代为例):
1. **强制协议锁定方案**
在 `vercel.json` 配置中使用 headers 强制指定回源协议:
- {
- "routes": [
- {
- "src": "/maps/api/(.*)",
- "dest": "http://maps.googleapis.com/maps/api/$1",
- "headers": {
- "X-Forwarded-Proto": "http",
- "X-Proxy-Protocol": "HTTP/1.1"
- }
- }
- ]
- }
复制代码
2. **协议重写中间件**
通过 Edge Function 实现协议转换:
- export default function middleware(request) {
- const url = new URL(request.url);
- if (url.pathname.startsWith('/maps/')) {
- return new Response(null, {
- headers: {
- 'x-rewrite-url': `http://maps.googleapis.com${url.pathname}${url.search}`,
- 'x-force-http': 'true'
- }
- });
- }
- }
复制代码
3. **DNS 层干预**
在域名解析设置中添加 TXT 记录:
- vercel-downgrade-protocol.http = force
复制代码
4. **缓存策略覆盖**
添加特定缓存指令避免 HTTPS 缓存污染:
- Cache-Control: no-protocol-transform, max-age=0
复制代码
5. **混合内容处理方案**
在响应头中插入内容安全策略:
- Content-Security-Policy: upgrade-insecure-requests; default-src http: 'unsafe-inline' 'unsafe-eval'
复制代码
该方案通过多层级干预实现:
1. 使用 Vercel 的 Edge Network 修改原始请求元数据
2. 通过中间件动态重写目标协议
3. 利用 DNS 声明协议处理策略
4. 避免 CDN 层的自动协议升级
5. 解决浏览器端的混合内容拦截
需要注意:
- 需在 Vercel 项目设置中关闭 "Auto SSL"
- 建议配合使用 `stunnel` 做本地隧道代理
- 实际部署时需要处理 Google 地图 API 的签名验证
- 可能遇到地图服务的协议校验机制,建议同时设置 `Referrer-Policy: unsafe-url`
如果遇到 426 协议错误,可尝试在请求头添加:
- Upgrade: HTTP/1.1
- Connection: keep-alive, Upgrade
复制代码
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。 |