获取Sinatra完整RefererURL的技巧分享
一分耕耘,一分收获!既然打开了这篇文章《获取 Sinatra 完整 Referer URL 的方法与技巧》,就坚持看下去吧!文中内容包含等等知识点...希望你能在阅读本文后,能真真实实学到知识或者帮你解决心中的疑惑,也欢迎大佬或者新人朋友们多留言评论,多给建议!谢谢!

本文探讨了在 Sinatra 应用中尝试获取完整引荐来源 URL 时遇到的常见问题,即 `request.referrer` 仅返回协议和域名。核心原因在于现代浏览器默认采用更严格的引荐来源策略(如 `strict-origin-when-cross-origin`),这导致跨域请求时引荐来源 URL 被截断。文章将详细解释这一机制,并通过示例代码展示问题,并提供理解和应对策略。
在构建 Web 应用程序时,有时我们需要了解用户是从哪个完整的 URL 跳转或引用到当前页面的。特别是在提供 JavaScript 代码给外部网站调用时,获取调用方网站的完整 URL 对于分析、日志记录或根据来源调整响应内容至关重要。然而,开发者在使用 Sinatra 框架的 request.referrer 或 request.env["HTTP_REFERER"] 属性时,可能会发现它们仅返回了引荐来源的协议和域名,而非完整的路径信息,这与预期行为不符。
问题场景复现
假设我们有一个 Sinatra 应用,其目标是识别调用其提供的 JavaScript 代码的远程网站的完整 URL。以下是一个简化的 Sinatra 应用示例,用于调试并打印出请求相关的环境变量:
require 'sinatra'
get %r{/test} do
debug = {
:referrer => request.referrer,
:http_referer => request.env["HTTP_REFERER"],
:path_info => request.path_info,
:query_string => request.query_string,
:host => request.host,
:url => request.url,
:path => request.path
}
STDERR.puts debug.inspect
erb "test" # 假设存在一个 test.erb 模板
end如果这个 Sinatra 应用部署在 http://www.server.com,并且有一个远程网站 http://www.remote.com/url-with-test-code.html 包含如下 HTML 代码,通过
