Cloudflare Worker 在现场中断重定向

Cloudflare Worker Breaks Redirects On Site

如果国家/地区不是美国,我有一个 cloudflare worker 会在页面中插入自定义 CSSS/Canada。然而,这非常有效 - 它会在插入 CSS 时中断所有重定向。下面附上工作脚本

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

async function handleRequest(request) {
    const country = request.cf.country
    if (country != 'US' && country !='CA') {
    const response = await fetch(request)
    const type = response.headers.get("Content-Type") || "";
    if (!type.startsWith("text/html")) {
     return response;
   }

    var html = await response.text()
    
    // Inject scripts
    const customScripts = 'styling here'
    html = html.replace( /<\/body>/ , customScripts)

    // return modified response
    return new Response(html, {
        headers: response.headers
    })
}
}

重定向已损坏,因为它们使用特殊的 HTTP 状态代码(通常为 301 或 302),但您的工作代码未将状态代码复制到最终响应,因此最终响应最终始终为 200状态码。

尝试改变这个:

    return new Response(html, {
        headers: response.headers
    })

为此:

    return new Response(html, response)

这样,新响应会复制旧响应的所有属性,正文除外。这包括 status 属性,因此状态代码将被复制过来。


顺便说一句,与此问题无关,我注意到您的代码还有另一个问题:

if (country != 'US' && country !='CA') {

看起来如果此条件的计算结果为假(也就是说,如果 country'US''CA'),那么您的 handleRequest() 函数不会return 一个回应。在这种情况下,将抛出异常,客户端将看到 1101 错误页面。我建议添加一个 else 子句,该子句 return 是您希望美国和加拿大用户看到的响应。