
可通过检查 HTTP 请求头中的 Accept 字段值判断:若包含 text/html(如浏览器地址栏直接访问),则为查看源码;若为 */* 或其他非 HTML 类型,则为脚本正常加载。此方法适用于服务端(如 Node.js、Nginx、Service Worker 代理)实现差异化响应。
可通过检查 http 请求头中的 `accept` 字段值判断:若包含 `text/html`(如浏览器地址栏直接访问),则为查看源码;若为 `*/*` 或其他非 html 类型,则为脚本正常加载。此方法适用于服务端(如 node.js、nginx、service worker 代理)实现差异化响应。
在 Web 开发中,有时需要对同一份 .js 文件提供双重用途:既作为可执行脚本被 <script> 标签或 ES 模块导入,又能在用户直接在浏览器地址栏输入路径(如 https://example.com/script.js)时,自动渲染为带语法高亮的 HTML 页面(例如配合 Service Worker 实现离线代码浏览)。关键前提在于——<strong>服务端或拦截层必须能可靠识别请求意图。</script>
核心原理在于浏览器发起请求时,Accept 请求头会因上下文不同而显著变化:
✅ 浏览器直接打开 JS 文件(查看源码):
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,...
→ 明确声明接受 HTML 类型,表明用户意图是“渲染为页面”。⚠️ 作为 <script> 加载或通过 import 导入</script>:
Accept: */*(或 application/javascript, text/javascript 等)
→ 不包含 text/html,表明资源应被解析执行,而非展示。
因此,检测逻辑简洁而可靠:
// 示例:Express.js 中间件(服务端)
app.get('/scripts/:file(*)', (req, res) => {
const accept = req.get('Accept') || '';
if (accept.includes('text/html')) {
// 用户直接打开:返回语法高亮 HTML 页面
const jsContent = fs.readFileSync(`./scripts/${req.params.file}`, 'utf8');
const highlightedHtml = highlightJsToHtml(jsContent); // 使用 highlight.js 等库
res.type('text/html').send(`
<!DOCTYPE html>
<html><body style="margin:0;font-family:monospace;">
<pre class="brush:php;toolbar:false;">${highlightedHtml}

















