惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Recent Announcements
Recent Announcements
P
Privacy International News Feed
AWS News Blog
AWS News Blog
C
Cybersecurity and Infrastructure Security Agency CISA
L
LINUX DO - 热门话题
Security Latest
Security Latest
T
Tenable Blog
Scott Helme
Scott Helme
L
LINUX DO - 最新话题
S
Security Archives - TechRepublic
H
Heimdal Security Blog
Know Your Adversary
Know Your Adversary
Hacker News: Ask HN
Hacker News: Ask HN
The Cloudflare Blog
N
News and Events Feed by Topic
www.infosecurity-magazine.com
www.infosecurity-magazine.com
V
V2EX
Latest news
Latest news
N
News and Events Feed by Topic
爱范儿
爱范儿
博客园 - 三生石上(FineUI控件)
Help Net Security
Help Net Security
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
人人都是产品经理
人人都是产品经理
小众软件
小众软件
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
S
Schneier on Security
博客园_首页
博客园 - 叶小钗
S
Securelist
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Last Week in AI
Last Week in AI
大猫的无限游戏
大猫的无限游戏
T
Troy Hunt's Blog
V
Visual Studio Blog
Spread Privacy
Spread Privacy
博客园 - 司徒正美
S
Security @ Cisco Blogs
罗磊的独立博客
月光博客
月光博客
云风的 BLOG
云风的 BLOG
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
A
About on SuperTechFans
T
Threatpost
Cisco Talos Blog
Cisco Talos Blog
博客园 - 【当耐特】

BlogFinder

日常漫步 Vol.24 之漫步前山河 - 雅余 周报 #1-聊聊本周的收获 - Edwin's Blog 我的OpenCode必装插件与Skill Write Something 掌中之物未必在掌握之中 · CRIVU PiliNara,一个更顺手的 PiliPlus 分支 「NekoEcho」:做一个必有回响的猫娘主题博客 2026-05 书影音总结 简化博客主题 - 安迪 你要加油呐 我第一次发布 npm 包 拾花小记#45:中考前的二三事 – 小改学习志 黛西花园5月游 #18 枇杷又熟了的五月月报 一些奇奇怪怪的需求?word仿方正书版的几个小操作 - Xiobb's Blog 0419 御温泉之旅 修复了一些bug,网站基本上趋于稳定了 - 新锐博客 又回到四十年前 如何定义成功 迷鹿屋2026已重新上线 科技冰火两重天+一周回顾 ${title} 热度退了,我反而用得更深了-咕咚同学 我到底该不该换个域名? 随身WIFI折腾记 - 安迪 博客撰写体验提升——hexo pro插件 为什么不用相机把屏幕上的接关密码拍下来? 国清寺与天台山 – Ouroboros ★★★★☆《挽救计划》——久违的经济上行感 - Davidの3号基地 删除右键“打开方式”里多余选项 第三周刊_No.53|一切都会被支付两次 安卓APP通话记录与录音上传踩坑记录 - 子舒的博客 天量下跌 inBox 笔记 2.3.8,把工具栏交给了你-咕咚同学 我把小龙虾搬到了微信-咕咚同学 安好 - 响石潭 Compound Engineering Plugin:让每个工程单元都比上一个更容易 MOSS-TTS Family:开源高质量语音与声音生成模型家族深度解析 Crawl4AI:专为 LLM 设计的开源 Web 爬虫与数据抓取工具 Build Your Own X:从零实现你最喜欢的技术——程序员进阶的终极资源清单 Anthropic Skills:用文件夹教 Claude 专业技能的开源框架 1年的去月球(下) - 梅之夏 欢迎回来。 简单讲讲 ASN.1 与 OID DTV - 直播聚合客户端 5.22-5.27 – 不兴江 还没去过鸭川 – 不兴江 张晶晶同学三刷林志颖 关于我 – 不兴江 爱与嫉妒 – 不兴江 港股被持续做空 备案码花了四百块-咕咚同学 一句话生成封面:我给公众号做了4种风格的AI封面生成技能 「官」方認證 再谈费曼学习法 2026-05-28T00:34:11+08:00 2026-05-28T00:28:45+08:00 离谱的英语学习指南:基于AI的英语进阶系统方法论 iii:零集成架构的后端统一运行时 Claude Code Harness:让 Claude Code 工作有迹可循的工程化框架 Heretic:全自动移除大语言模型审查机制的开源工具 MarkItDown:微软开源的万能文档转 Markdown 利器 Harness:让 Claude Code 秒变多智能体协作工厂 这段时间尽折腾AI Agent了,确实极大地提高了效率 近期动态:两个新站点正式上线啦 误判解除!zhouayuan.com 腾讯安全申诉成功 - 周阿源|玩具设计・插画日常・生活随笔 Ralph:让 AI 编码工具自主循环跑完所有 PRD 任务的量产神器 全都违法 – 个人工作记录 关于zhouayuan.com被误判 “含违规信息” 的说明与申诉记录 - 周阿源|玩具设计・插画日常・生活随笔 小米 MiMo v2.5 Pro 白嫖 最大的人间清醒,兜里有钱,但是不花。 夜晚靓歌(12):于文文现场solo - 王志勇的Blog 今日插画:风扬起的倔强 - 周阿源|玩具设计・插画日常・生活随笔 回门习俗 独立网卡 - 忘记了回忆 500亿入股人工智能企业 从命令行到桌面智能体-咕咚同学 第一性原理读书笔记 行者微评论223-加班の守株待兔-博客|政治与时事-风雨行者 ZOZO开源物理接触求解器:GPU加速的可扩展仿真引擎 OpenStock:开源股票市场交易平台技术深度解析 MoneyPrinterTurbo:基于AI的全自动短视频生成工具深度解析 Claude-Mem:为 Claude Code 构建的持久化记忆压缩系统 Twenty:可代码化定制的企业级开源 CRM 平台技术深度解析 2026-05-26T22:59:17+08:00 企业级开源大模型部署平台 GPUStack 实战教程 1年的去月球(上) - 梅之夏 Sevalla - 静态网站托管服务 不用翻墙、不用注册、不用月费,普通人也能用上 Claude Code 装修灯具要注意⚠️ 黄梅天先锋 - 游子微博 公安备案顺利办结,站点备案全部完成 - 周阿源|玩具设计・插画日常・生活随笔 第三次兑换天猫超市卡了宗宗酱-三维狐少儿编程 Don't think, feel. - Rolen's Blog 人这一辈子,到底图个什么 博客迁移 - Edwin's Blog 情感赛道写作模板 再现本轮行情的典型特征 裁员与平常心-咕咚同学 别让“偷懒”,成为隐私泄露的破绽
Nginx 又双叒给我挖坑了:HSTS 撞车 + 宝塔偷偷锁 Frame
吴蛋蛋 · 2026-06-14 · via BlogFinder

环境:Nginx 1.28.3 + 宝塔面板 + Halo 2.x + Cloudflare

把博客从 Typecho 搬到 Halo 2.x,Docker Compose 跑起来,反代配好,心想总算能歇了。

结果一接 Cloudflare,控制台开始疯狂报红。再一试跨站嵌入,直接给我拒了。两个坑连环爆,折腾了一晚上,记录一下,下次别再踩了。

动漫版头图,可爱吧
动漫版头图,可爱吧

第一坑:HSTS 重复输出,Cloudflare 和我各说各话

咋回事呢?

我习惯在 Nginx 里开 HSTS,强制走 HTTPS:

add_header Strict-Transport-Security "max-age=31536000" always;

接入 Cloudflare 后,浏览器开始骂街——Duplicate Header。

因为 Cloudflare 边缘节点本身就会统一添加 HSTS 头,回源时我再加一次,就撞车了。一个响应头出现两次,浏览器很懵:你俩到底听谁的?

我第一反应:上 if 啊!

这还不简单?判断一下有没有 Cloudflare 的特征头,没有再加 HSTS 呗:

# 直觉写法,当场翻车
if ($http_cf_ray = "") {
    add_header Strict-Transport-Security "max-age=31536000" always;
}

​nginx -t​ 直接甩脸:

[emerg] "add_header" directive is not allowed here

???不让我加?

后来才知道,Nginx 的 if 出了名的邪门,江湖人称 "If is Evil"。你想在 if 里塞 add_header​?门儿都没有。这玩意儿只能在 serverlocation 里裸奔,不能塞进 if​ 的怀抱。

解法:map 大法好

既然 if 靠不住,那就把逻辑抽到 http 块,用 map 做判断(注意:map 不能放在 server 块内部):

http {
    # 动态 HSTS 智能过滤映射
    # Nginx 1.7.5+ 支持:值为空字符串时 add_header 自动隐匿
    map $http_cf_ray $dynamic_hsts {
        default "";                    # 有 cf-ray?走 Cloudflare,HSTS 留空
        ""      "max-age=31536000";    # 没 cf-ray?直连源站,上 HSTS(有效期1年)
    }
    
    server {
        # ...
        add_header Strict-Transport-Security $dynamic_hsts always;
    }
}

妙处来了: Nginx 1.7.5+ 中,add_header​ 有个隐藏特性——值是空字符串 ""​ 时,这个头直接隐身,不会出现在响应里

所以走 Cloudflare 时 $dynamic_hsts""HSTS 自动消失;直连源站时输出 max-age=31536000,完美。if​ 你不行,我 map 上,照样搞定。


第二坑:宝塔偷偷给我加了 X-Frame-Options

又是咋回事呢?

我想搞跨站嵌入,结果浏览器死活不让:

拒绝在 Frame 中加载,因为响应头包含了 X-Frame-Options: SAMEORIGIN

我明明在反代里写了:

proxy_hide_header X-Frame-Options;

Halo 后端吐的头应该被抹掉了啊,这 SAMEORIGIN 从哪冒出来的?我一度怀疑人生,是不是 Halo 在跟我作对。

排查:宝塔是内鬼

顺着配置翻啊翻,发现宝塔面板自动生成了一堆扩展 conf(注意:wuqishi.com 替换为你的实际域名):

include /www/server/panel/vhost/nginx/extension/wuqishi.com/*.conf;
include /www/server/panel/vhost/nginx/generic/wuqishi.com/*.conf;

里面静静躺着:

add_header X-Frame-Options SAMEORIGIN;

好家伙,宝塔你背刺我!

关键认知proxy_hide_header 只能藏后端服务器吐的头,对 Nginx 自己配置里写的头完全没辙。宝塔全局一加,我的反代配置根本管不到,就像你在家锁了门,结果物业在小区大门又加了一道锁。

解法:不跟宝塔纠缠,直接上 CSP

去翻宝塔文件删了?太怂,而且面板一更新可能又刷回来,跟打地鼠似的。直接在反代入口写三重保险:

# 第一重:后端来的 X-Frame-Options,抹掉
proxy_hide_header X-Frame-Options;

# 第二重:宝塔全局加的?强行重置为空,浏览器看到空值直接忽略
add_header X-Frame-Options "" always;

# 第三重:终极杀招,CSP 的 frame-ancestors 优先级碾压 X-Frame-Options
# * 表示允许所有域名嵌入,如需限制改为 https://example.com
add_header Content-Security-Policy "frame-ancestors *" always;

原理: 现代浏览器里,CSP 的 frame-ancestors 指令优先级远远高于老古董 X-Frame-Options​。看到 frame-ancestors *​,浏览器当场无视 SAMEORIGIN,跨站嵌入一路绿灯。

* 意思是 "谁都能嵌",如果你只想让特定域名嵌,如改成 frame-ancestors https://wuqishi.com 就行。但我懒,先开全通,后面再收紧。


收工,总结一下

两个坑,都是响应头的小把戏,但排查起来很费神。最后靠 mapCSP 组合拳搞定,没动业务逻辑,纯粹是边缘层的斗智斗勇。

核心解法

一句话总结

HSTS 撞车

​map动态变量

有 Cloudflare 就隐身,直连再上 HSTS

宝塔锁 Frame

CSPframe-ancestors​

优先级碾压,不跟宝塔文件纠缠

nginx -t 绿灯,配置保存不报错。响应头清清爽爽,强迫症舒服了。


解决问题的乐趣就在于此,把流量在边缘层梳理得明明白白,爽。