如何检测浏览器的‘输入式’HTTP请求及view-source发起的请求?
区分浏览器预加载请求与实际访问请求
这类地址栏输入触发的请求是浏览器的预取/预加载请求(如Chrome Omnibox预加载、Firefox地址栏预览),用于提前加载资源提升体验,但会导致服务器重复执行业务逻辑。区分方法如下:
1. 核心判断:请求头标识
浏览器会为预加载请求添加特殊请求头,可通过Request.ServerVariables读取对应变量(请求头名转大写、连字符替换为下划线,前缀加HTTP_):
- 检查
HTTP_PURPOSE或HTTP_X_PURPOSE:值通常为prefetch、preview或prerender - 检查
HTTP_SEC_PURPOSE:新标准头,值包含prefetch或preload
ASP代码示例:
Dim isPrefetch isPrefetch = False If Request.ServerVariables("HTTP_PURPOSE") = "prefetch" Or _ Request.ServerVariables("HTTP_X_PURPOSE") = "preview" Or _ InStr(Request.ServerVariables("HTTP_SEC_PURPOSE"), "prefetch") > 0 Then isPrefetch = True End If If isPrefetch Then ' 跳过耗时逻辑,返回轻量响应或直接终止 Response.Status = "204 No Content" Response.End() End If
2. 辅助判断维度
- 预加载请求通常为
GET方法,部分浏览器不会携带用户会话Cookie - 少数浏览器会在
HTTP_USER_AGENT中包含预加载相关标识,但可靠性低于请求头
捕获view-source:发起的请求
view-source:协议发起的请求本质是普通GET请求,但不同浏览器存在差异化标识:
- Firefox会发送
X-View-Source: true请求头,可通过Request.ServerVariables("HTTP_X_VIEW_SOURCE")读取 - Chrome/Edge等浏览器暂无统一特殊头,可通过以下方式辅助判断:
- 请求的
HTTP_REFERER为空(用户直接在地址栏输入view-source:URL) - 该请求无后续静态资源(JS/CSS/图片)的关联请求(需结合访问日志分析)
- 请求的
ASP代码示例:
Dim isViewSource isViewSource = False ' 检测Firefox的view-source专属标识 If Request.ServerVariables("HTTP_X_VIEW_SOURCE") = "true" Then isViewSource = True End If ' 辅助判断:空Referer场景 If isViewSource = False And Request.ServerVariables("HTTP_REFERER") = "" Then ' 可结合日志二次验证是否为view-source访问 End If If isViewSource Then ' 执行自定义逻辑,如记录日志、限制访问等 End If
注意:不同浏览器实现存在差异,无法100%准确识别所有view-source请求,需结合业务场景调整策略。
内容的提问来源于stack exchange,提问作者user5713140
相关产品推荐
相关产品推荐

