You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让非Heroku部署的WordPress在Heroku Rails应用的/blog路径可用?

解决方案:用Cloudflare边缘代理实现/blog路径路由到外部WordPress

你的思路完全正确——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请求

    1. 进入Cloudflare控制台的「Page Rules」页面,点击「Create Page Rule」
    2. 在「If the URL matches」输入框中填写:https://www.example.com/blog/*(*是通配符,匹配/blog下的所有子路径,比如/blog/post-1)
    3. 点击「Add a setting」,选择「Forwarding URL」
    4. 选择「Proxy」(注意不要选「Redirect」,否则用户会看到URL跳转到WordPress域名),然后在「Destination URL」中填写你的WordPress服务器地址,比如https://your-wordpress-server.com/$1($1会自动匹配前面*对应的内容,比如/blog/post-1会转发到https://your-wordpress-server.com/post-1)
    5. 保存规则并等待生效(通常几分钟内就会生效)
  • 第三步:配置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脚本

    1. 进入Cloudflare控制台的「Workers & Pages」页面,点击「Create Worker」
    2. 替换默认脚本为以下代码(记得把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)
    }
    
    1. 保存并部署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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:40:04