You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

咨询:如何在CloudFlare将3001端口转发至api子域名?

解决Cloudflare将带端口域名转发到子域名的问题

你好呀!我看你之前尝试用Page Rules没成功,其实这个需求可以通过几种实用的方式实现,我来给你详细拆解下:

方法一:用Cloudflare Workers(推荐,灵活且无需修改服务器配置)

Workers是Cloudflare的边缘无服务器脚本,能直接在Cloudflare节点处理请求转发,步骤很清晰:

  • 登录Cloudflare后台,进入你的域名管理面板,点击左侧的「Workers」选项
  • 创建一个新的Worker,把下面的代码粘贴进去(记得替换成你的目标地址):
addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  const url = new URL(request.url)
  // 替换成你实际的带端口目标地址
  const targetUrl = new URL('https://mywebsite.com:3001' + url.pathname + url.search)
  
  // 构造转发请求,保留原请求的方法、头信息等
  const modifiedRequest = new Request(targetUrl, {
    method: request.method,
    headers: request.headers,
    body: request.body,
    redirect: 'follow'
  })
  
  // 获取转发后的响应并调整跨域头(如果API需要跨域调用的话)
  const response = await fetch(modifiedRequest)
  const modifiedResponse = new Response(response.body, response)
  modifiedResponse.headers.set('Access-Control-Allow-Origin', '*')
  
  return modifiedResponse
}
  • 保存Worker后,回到域名的「Workers」页面,点击「Add Route」,设置路由为 api.mywebsite.com/*,选择刚才创建的Worker保存即可。

这样所有访问https://api.mywebsite.com/的请求都会被悄悄转发到https://mywebsite.com:3001/,用户完全看不到原地址,完美适配API调用的需求。

方法二:修正Cloudflare Page Rules配置(若偏好使用Page Rules)

你之前用Page Rules没成功,大概率是配置方向错了——Page Rules的「Forwarding URL」是重定向,会让浏览器地址栏跳转到带端口的原地址,这显然不是API调用想要的效果。如果非要用Page Rules,其实它不支持反向代理,只能做地址跳转,若你只是临时需要地址映射,可以这么配置:

  • 进入Cloudflare后台「Rules」→「Page Rules」,点击「Create Page Rule」
  • URL匹配规则填 api.mywebsite.com/*
  • 添加设置选择「Forwarding URL」,再选「301 Permanent Redirect」,目标URL填 https://mywebsite.com:3001/$1
  • 保存规则即可。但还是要提醒:这种方式会暴露原带端口的地址,不太适合API调用场景。

方法三:配合Apache反向代理(需修改服务器配置)

如果你愿意调整服务器上的Apache配置,可以让Apache直接把api子域名的请求转发到Node.js的3001端口,再通过Cloudflare代理这个子域名:

  1. 先确保Apache启用了必要模块:
a2enmod proxy proxy_http proxy_html
  1. 在Apache的站点配置文件(比如/etc/apache2/sites-available/mywebsite.conf)里添加新的虚拟主机:
<VirtualHost *:443>
    ServerName api.mywebsite.com
    SSLEngine on
    # 这里可以用Cloudflare的Origin CA证书,或者你自己的SSL证书
    SSLCertificateFile /path/to/your/cert.crt
    SSLCertificateKeyFile /path/to/your/private.key

    # 开启反向代理,把请求转发到本地3001端口
    ProxyPreserveHost On
    ProxyPass / http://localhost:3001/
    ProxyPassReverse / http://localhost:3001/
</VirtualHost>
  1. 重启Apache生效:
systemctl restart apache2
  1. 最后在Cloudflare的DNS里添加一条A记录,api指向你的服务器IP,并且开启橙色云朵(启用Cloudflare代理)。

这种方法的好处是把转发逻辑放在服务器端,Cloudflare只需要正常代理子域名即可,适合有服务器配置权限的场景。

重要注意事项

  • 无论用哪种方法,都要把Cloudflare的SSL模式设置为「Full」或「Full (strict)」,否则会出现HTTPS握手错误;
  • 如果用Workers或Apache反向代理,要确保Node.js服务器允许来自Cloudflare或Apache的请求,必要时可以把Cloudflare的IP段加入白名单。

希望这些方法能帮你顺利解决问题!

内容的提问来源于stack exchange,提问作者Alden Willms

火山引擎 最新活动