如何让非Heroku部署的WordPress在Heroku Rails应用的/blog路径可用?
你的思路完全正确——DNS层面确实没法直接解决这种路径级的路由,但Cloudflare这类边缘代理工具可以在请求到达Heroku之前拦截并转发,完美满足你的需求:既不用修改Heroku路由器配置,也不会让Rails应用处理/blog相关请求,同时保持https://www.example.com/blog的URL结构符合SEO要求。
下面是两种具体的实现方案,分别适合简单场景和复杂场景:
方案一:Cloudflare Page Rules(快速上手,适合简单路由)
这是最直接的方法,不需要编写代码,通过Cloudflare的可视化规则配置就能完成:
第一步:确保域名已托管在Cloudflare
先把www.example.com的DNS记录指向Heroku,并且Cloudflare的代理状态设为橙色(开启反向代理)——只有开启代理,Cloudflare才能拦截并处理请求。第二步:创建Page Rule路由/blog请求
- 进入Cloudflare控制台的「Page Rules」页面,点击「Create Page Rule」
- 在「If the URL matches」输入框中填写:
https://www.example.com/blog/*(*是通配符,匹配/blog下的所有子路径,比如/blog/post-1) - 点击「Add a setting」,选择「Forwarding URL」
- 选择「Proxy」(注意不要选「Redirect」,否则用户会看到URL跳转到WordPress域名),然后在「Destination URL」中填写你的WordPress服务器地址,比如
https://your-wordpress-server.com/$1($1会自动匹配前面*对应的内容,比如/blog/post-1会转发到https://your-wordpress-server.com/post-1) - 保存规则并等待生效(通常几分钟内就会生效)
第三步:配置WordPress适配路径
为了让WordPress生成的链接都指向/blog路径,需要在WordPress的wp-config.php文件中添加以下配置:define('WP_HOME', 'https://www.example.com/blog'); define('WP_SITEURL', 'https://www.example.com/blog');同时把WordPress的「固定链接」设置改为不带域名的格式(比如「文章名」),避免生成指向WordPress原生域名的链接。
方案二:Cloudflare Workers(灵活定制,适合复杂场景)
如果你的路由逻辑更复杂(比如需要根据请求方法、头信息做不同处理),可以用Cloudflare Workers编写自定义代码来处理请求:
第一步:创建Worker脚本
- 进入Cloudflare控制台的「Workers & Pages」页面,点击「Create Worker」
- 替换默认脚本为以下代码(记得把
https://your-wordpress-server.com替换成你的WordPress实际地址):
addEventListener('fetch', event => { event.respondWith(handleRequest(event.request)) }) async function handleRequest(request) { const url = new URL(request.url) // 拦截所有以/blog开头的请求 if (url.pathname.startsWith('/blog')) { // 构造WordPress的请求URL,移除/blog前缀 const wpPath = url.pathname.replace('/blog', '') || '/' const wpUrl = new URL(`https://your-wordpress-server.com${wpPath}`) wpUrl.search = url.search // 转发请求到WordPress,保留原请求的方法、头信息和请求体 const response = await fetch(wpUrl.toString(), { method: request.method, headers: request.headers, body: request.body, redirect: 'follow' }) // 修改响应头,确保Cookie和主机头正确 const modifiedResponse = new Response(response.body, response) modifiedResponse.headers.set('X-Forwarded-Host', url.host) return modifiedResponse } // 非/blog请求直接转发到Heroku的Rails应用 return fetch(request) }- 保存并部署Worker
第二步:绑定Worker到/blog路由
在Worker的「Triggers」页面,点击「Add Route」,输入https://www.example.com/blog/*,选择你的域名,保存即可。
关键注意事项
- SSL配置:确保Cloudflare的SSL/TLS设置为「Full」或「Full (strict)」,因为Heroku和WordPress都使用HTTPS,避免出现SSL握手错误。
- 缓存策略:如果需要缓存WordPress内容,可以在Cloudflare的「Cache Rules」中单独配置
/blog路径的缓存规则,提升访问速度。 - 测试验证:修改规则后记得清除浏览器缓存,用curl或者浏览器的隐私模式测试,确保
/blog路径正确加载WordPress内容,同时主站其他路径正常访问Rails应用。
这个方案完全绕开了Heroku路由器的限制,所有/blog请求在Cloudflare的边缘节点就被转发到WordPress,不会到达你的Rails应用,完美符合你的需求。
内容的提问来源于stack exchange,提问作者Nicolas Maloeuvre

