反向代理 Cloudflare Workers 并禁止直连

背景

  • CF 的 *.workers.dev 域名不适合直接使用,一种方案是使用一台服务器反向代理它
  • 反向代理后,不希望 *.workers.dev 域名还能被搜索引擎访问,这样对 SEO 不好

方案

  • 反代服务器代理 Workers 请求,同时添加标识 Header
  • Worker 检测请求是否来自可信代理,直连 Workers 返回禁止访问提示

反代服务器配置

  • 在 Nginx 反代配置中,添加标识 Header:proxy_set_header X-Proxy-Source hello;
  • hello 可以自行修改
  • 1Panel 可以在反向代理管理中的 “源文” 处修改

Worker 端逻辑

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  const fromProxy = request.headers.get('X-Proxy-Source') === 'proxy'

  if (!fromProxy && request.url.includes('.workers.dev')) {
    return new Response(
      `禁止直接访问!`,
      {
        status: 403,
        headers: {
          'Content-Type': 'text/plain; charset=utf-8',
          'Cache-Control': 'no-store'
        }
      }
    )
  }
}

效果

  • 用户直连 workers.dev,403 + 提示文案
  • 用户访问反代域名 → 反代 → Worker,正常返回业务逻辑