如何在 Cloudflare Workers 中不丢失 301 https 重定向的引用值

Posted

技术标签:

【中文标题】如何在 Cloudflare Workers 中不丢失 301 https 重定向的引用值【英文标题】:How not to loose referer value on 301 https redirects in Cloudflare Workers 【发布时间】:2019-09-16 20:53:13 【问题描述】:

我正在尝试使用 cloudflare 工作者通过 301 重定向从 HTTPS 域A 到 HTTPS 域B 传递 Ref(f)erer。

1) 用户在浏览器地址字段中输入https://domainA.com,这样的请求头被发送到服务器:

此请求随后由此类 Cloudflare 工作人员处理:

<...>
return new Response("Will Redirect", 
status: 302,
statusText: 'Found',
headers: 
  Location: "https://domainB.com",
  "Referrer-Policy": "unsafe-url"
 
)
<...>

此代码生成这样的 HTTP 响应:

看起来“到目前为止一切都很好” - 推荐人策略标头已设置并正在出现,但在请求/响应标头之前 Chrome 显示同一请求的“常规”信息:

据我了解,^ 是对请求/响应组合的快速总结。此推荐人政策:no-referrer-when-downgrade 行在哪里到达那里?是 Chrome 的默认请求参数还是 Chrome 默认将其添加到响应中?或者这些是 Cloudflare 的一些默认设置?我想这是我无法通过 Referrer 的潜在原因之一。

然后 302 重定向加载 domainB 并且此请求由第二个 worker 处理:

<...>
let refr = request.headers.get('Referer')
let resp = new Response(`Testing referer: $refr`)
resp.headers.set('Referrer-Policy', 'unsafe-url')
return resp
<...>

第二个请求/响应如下:

但是来自 domainB 的响应如下:

虽然我期待看到 Testinf 推荐人: domainA.com 。我将如何实现这一目标?

谢谢!

【问题讨论】:

【参考方案1】:

好吧,事实证明,您无法确定是否会传递Referer,因为它完全取决于访问者的浏览器。建议的方法是在 301 重定向位置使用 domainB.com?domainid=xyz 并确保第二个域知道 xyz 代表 domainA。

【讨论】:

以上是关于如何在 Cloudflare Workers 中不丢失 301 https 重定向的引用值的主要内容,如果未能解决你的问题,请参考以下文章

如何在不增加成本情况下使用Cloudflare Cron 触发器?

Cloudflare 发布关于2022 年的一些预测

如何从 Cloudflare 工作人员内部发布到 GCP PubSub 主题

如何在 Cloudflare 中添加域掩码?

如何“动态”在 PHP 中向 cloudflare 添加子域?

如何解决 Cloudflare 无效 SSL (error526)?