咨询:如何在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代理这个子域名:
- 先确保Apache启用了必要模块:
a2enmod proxy proxy_http proxy_html
- 在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>
- 重启Apache生效:
systemctl restart apache2
- 最后在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




