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 是您希望美国和加拿大用户看到的响应。
如果国家/地区不是美国,我有一个 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 是您希望美国和加拿大用户看到的响应。