反向代理之后,应用为什么总是看见“代理服务器 IP”?——真实客户端 IP 的原理、风险与正确配置

在自建网站和家庭服务器中,一个非常常见的架构是: 这种架构很实用。HTTPS 可以集中在反向代理处终止,不同域名可以被分发到不同服务,后端应用也不必直接暴露在公网。 但它同时带来了一个容易被忽视的问题: 后端应用看到的客户端 IP,往往不是真正访问者的 IP,而是反向代理服务器的 IP。 这不仅影响日志可读性,还会直接影响登录审计、暴力破解防护、封禁策略和安全取证。 理解这个问题,需要先弄清楚 IP 地址到底是在网络的哪一层产生和传递的。 一、为什么后端应用会看到代理服务器的 IP 假设一个客户端访问网站: 客户端首先与反向代理建立 TCP 连接。 例如: 此时反向代理当然能够知道真正的客户端地址: 但是接下来,反向代理会自己重新建立一个连接到后端应用: 对于后端服务器来说,这是一条新的 TCP 连接。 所以它在网络层看到的源地址实际上是: 而不是最初的: 这不是 Bug,而是反向代理工作的正常结果。 可以理解为: 原始客户端和后端应用之间,并不存在一条完整的端到端 TCP 连接。 中间的反向代理把连接“截断”成了两段。 二、真实 IP 是怎样传给后端应用的 既然 TCP 层的客户端地址已经变成代理服务器,那么真实地址只能通过 HTTP 层额外传递。 最常见的几个 HTTP Header 是: 以及: 因此完整流程变成: 这时候后端应用就有机会恢复真正的客户端地址。 不过,这里马上出现了一个安全问题。 三、X-Forwarded-For …

将 WordPress 从主域名子目录迁移到独立子域名

一些 WordPress 网站在最初部署时,会直接放在主站的一个子目录下,例如: 随着网站长期运行,博客逐渐成为一个相对独立的应用,此时将其迁移到独立子域名: 通常能够获得更清晰的系统边界。 但这并不是简单修改一个链接。 对于已经运行多年的 WordPress,子目录迁移到子域名通常会涉及: 本文记录一种风险相对较低的迁移方法: 公网地址迁移到新的子域名,但 WordPress 的物理目录保持不变。 这样能够最大限度减少与域名迁移无关的文件系统变化。 一、迁移目标 假设原来的 WordPress 地址为: 希望迁移到: WordPress 原本安装在服务器上的某个目录: 迁移后这个目录仍然保持不变。 也就是说,只改变: 而不改变: 最终架构大致为: 新的子域名直接映射到 WordPress 的现有物理目录。 这种方式有一个很重要的优势: 域名迁移与文件系统迁移彻底解耦。 二、不要先修改 WordPress 比较安全的迁移顺序并不是: 而应该反过来: 原因很简单。 一旦 WordPress 的: 被修改,它就可能立即开始: 如果此时新域名的 DNS、TLS 或 Web Server 还没有准备好,站点就会进入半迁移状态。 因此应该首先让: 具备正常到达 WordPress 后端的能力。 三、先确认 WordPress …

MacBook 触控板为什么按哪里都有“咔嗒”感?——Force Touch 原理科普

如果你使用过配备 Force Touch 触控板的 MacBook,很容易注意到一个很特别的现象: 无论按触控板的左上角、右下角,还是正中央,几乎都能获得非常一致的“咔嗒”点击感。 这很容易让人产生一个疑问: 触控板下面是不是铺满了很多按钮? 其实并不是。 MacBook 的 Force Touch 触控板并不依赖大量机械按钮,而是通过压力传感器与 Taptic Engine 触觉反馈机构,主动制造出一种非常接近机械按键的点击感觉。 这也是 MacBook 触控板体验与很多传统笔记本触控板明显不同的原因之一。 一、传统触控板是真的“按下去” 传统笔记本触控板通常采用比较直接的机械结构。 触控板本身是一块可以发生轻微位移的面板,下面安装机械开关。当用户向下按压时,面板产生位移并触发开关,从而完成一次点击。 可以简单理解为: 这种结构存在一个天然问题: 不同位置的按压手感可能不同。 很多传统触控板采用类似“上方固定、下方活动”的结构,因此: 因此,一块面积很大的传统机械触控板,很难做到整个表面都具有完全一致的点击感。 二、Force Touch 换了一种思路 Force Touch 触控板采用了完全不同的设计理念。 当你向下按压时,触控板表面的玻璃并不需要像传统按钮一样产生明显的机械位移。 系统主要依靠两类部件: 压力传感器和触觉反馈机构。 压力传感器可以判断用户施加了多大的力。 也就是说,系统不仅能够知道: 手指现在位于什么位置。 还能够进一步知道: 用户现在按得有多重。 当按压力度达到系统设定的点击阈值时,就会触发下一步: Taptic Engine 开始工作。 三、“咔嗒”其实是制造出来的 Taptic Engine 是一种高精度触觉反馈装置。 …

Zeitgeist-datahub 是什么?Linux 桌面里一个记录“你做过什么”的老牌服务

在 Linux 系统中执行: 有时会得到这样的结果: 这个名字看起来颇为神秘。Zeitgeist 是德语,通常可以理解为“时代精神”;而在 Linux 世界中,它却是一套曾经相当重要的用户活动记录框架。 简单来说: Zeitgeist 用来记录用户在桌面环境中发生过的活动,而 zeitgeist-datahub 是负责从后台收集部分活动事件的组件。 它不是病毒,也不是传统意义上的系统日志程序,更不是用于监控整个 Linux 系统的审计工具。它最初的目标,是让桌面环境“记住”用户最近做过什么,从而提供更智能的搜索、历史记录和内容推荐功能。 一、Zeitgeist 到底记录什么? 我们平时使用桌面电脑,会不断产生各种行为: 传统文件系统知道一个文件在哪里,却不一定知道: “这个用户昨天晚上打开过哪些文件?” 或者: “最近经常使用哪些文档?” 这正是 Zeitgeist 当年想解决的问题。 ArchWiki 对它的描述也非常直接:Zeitgeist 是一个记录用户活动和事件的服务,可以记录诸如打开文件等活动,并把这些信息提供给其他应用程序,以便生成时间线、统计信息等功能。 因此,可以把 Zeitgeist 理解成一个: “桌面活动历史数据库”。 例如,系统可能形成类似这样的事件: 应用程序随后就可以查询这些记录,实现“最近使用”“最近打开”“活动历史”等功能。 二、那 zeitgeist-datahub 又是什么? Zeitgeist 并不是只有一个程序。 其中比较重要的两个角色,可以简单理解为: zeitgeist-datahub 的重点在于 Data Hub——数据收集中心。 它运行在后台,通过一些被称为 logger 的组件收集用户活动,然后把事件传递给 Zeitgeist 服务。 …

西瓜酱豆:西瓜、黄豆与发酵共同造就的传统风味

提到西瓜,大多数人首先想到的是夏天、冰镇、清甜和解暑。但在中国一些地区,西瓜还有一种完全不同的吃法:把它和黄豆、盐以及香料放在一起,经过一段时间的发酵,做成一种咸鲜浓郁的酱——西瓜酱豆。 第一次听到这个名字时,很多人可能都会疑惑:西瓜这么甜、含水量又这么高,怎么会和黄豆酱联系到一起? 其实,西瓜酱豆的核心并不在“西瓜”,而在两个字:发酵。 西瓜酱豆到底是什么? 西瓜酱豆是一类以黄豆和西瓜为主要原料制作的传统发酵酱。 不同地区、不同家庭的做法差异很大,有些偏咸,有些偏甜,有些会加入大量辣椒,有些则突出豆香和果香。但基本思路通常比较一致: 先把黄豆煮熟,经过制曲,使黄豆上生长适合酿造的微生物;随后加入成熟西瓜、食盐以及花椒、八角、辣椒、生姜等香料,再经过一段时间的发酵,最终形成浓稠的酱。 因此,它和黄豆酱、豆瓣酱、酱油其实有一定亲缘关系,都属于利用微生物改变大豆成分、创造复杂风味的传统发酵食品。 西瓜则是其中一个很特别的角色。 为什么酱豆里面要放西瓜? 从食品化学角度看,西瓜其实是一种非常适合参与发酵的原料。 它首先提供了大量水分。 西瓜果肉中绝大部分都是水,因此制作西瓜酱豆的时候,通常不需要额外加入太多水。随着西瓜果肉破碎,汁液自然渗出,黄豆便会逐渐浸泡在西瓜汁形成的发酵液中。 其次,西瓜还提供糖。 西瓜中主要含有三类可溶性糖: 葡萄糖、果糖和蔗糖。 其中葡萄糖和果糖属于单糖,蔗糖属于双糖。这些糖不仅赋予西瓜甜味,同时也是许多微生物容易利用的碳源。 换句话说,西瓜在这里既是“水”,也是“糖”,还是“香气来源”。 这也是为什么它并不是简单作为一种配菜加入黄豆酱,而是真正参与了整个发酵过程。 黄豆在发酵过程中发生了什么? 黄豆最大的特点之一,是蛋白质含量很高。 但完整的大豆蛋白分子非常大,并不会直接产生我们熟悉的酱香和鲜味。 真正神奇的变化发生在发酵过程中。 在传统制酱过程中,黄豆经过制曲以后,微生物会产生大量酶,其中非常重要的一类就是蛋白酶。 蛋白酶会把大分子的蛋白质逐渐切成: 蛋白质 → 多肽 → 小肽 → 氨基酸 其中一些氨基酸本身就具有鲜味或者甜味。 例如谷氨酸就是许多发酵食品鲜味的重要来源之一。 因此,刚煮熟的黄豆和发酵完成的酱豆,虽然原料还是同一种黄豆,但味道已经完全不同。 这也是酱油、味噌、黄豆酱等食品为什么能够产生强烈“鲜味”的基本原理。 西瓜里的糖去了哪里? 加入西瓜以后,其中的葡萄糖、果糖和蔗糖也不会完全保持原样。 一部分糖会留在酱中,给成品带来柔和的甜味。 另一部分则会被参与发酵的微生物利用。 微生物在代谢糖的过程中,会产生多种新的物质,例如: 有机酸、醇类、酯类以及其他挥发性风味化合物。 这些物质又会和黄豆发酵产生的氨基酸、脂肪酸以及其他物质共同作用,最终形成一种非常复杂的香味。 所以,西瓜酱豆最后尝起来并不是简单的: “黄豆酱 + 西瓜汁”。 它实际上已经变成了一种新的食品。 为什么发酵之后还能吃出“西瓜味”? 这是西瓜酱豆最有意思的地方之一。 …

从西贡到胡志明市:一座城市与一个名字背后的越南近现代史

今天打开越南地图,在越南南部可以看到一座名叫**胡志明市(Thành phố Hồ Chí Minh)**的巨大城市。但如果阅读历史书、看越南战争纪录片,或者直接到当地旅行,又会不断遇到另一个名字——西贡(Sài Gòn / Saigon)。 实际上,这两个名字紧密联系着同一座城市,也浓缩了越南近现代一百多年的历史。 而要理解为什么“西贡”会变成“胡志明市”,就必须认识一个人:胡志明(Hồ Chí Minh,1890—1969)。 一、西贡在哪里? 西贡位于越南南部,坐落在西贡河沿岸,距离湄公河三角洲不远。 它就是今天胡志明市的前身和旧称。 如今的胡志明市是越南南部最重要的经济和交通中心之一。越南官方旅游网站在介绍这座城市时,也直接称它为“formerly known as Saigon(原称西贡)”,而且在旅游、商业和日常语言中,“Saigon”这个名字直到今天仍然大量出现。 因此: 西贡并不是一个已经完全消失的地名。 “胡志明市”是今天的正式行政名称,而“西贡”依然是一种具有很强历史和城市文化色彩的称呼,有时也特指传统的中心城区。 这也是为什么到了今天,你仍然会看到大量以 Saigon 命名的酒店、餐厅、企业和商品。 二、西贡为什么如此重要? 西贡的重要性首先来自它的地理位置。 这里位于越南南部水网密布的平原地区,又能够通过西贡河连接海洋。法国殖民印度支那时期,城市得到大规模建设,今天胡志明市中心仍保存着不少殖民时期形成的城市建筑,例如西贡中央邮局、圣母大教堂一带以及歌剧院等。越南官方旅游资料也把这些建筑视为现代胡志明市历史景观的重要组成部分。 但真正让“西贡”这个名字进入世界历史的,是20世纪持续数十年的战争。 这一切又要从法国殖民越南说起。 三、胡志明是谁? 胡志明出生于1890年,出生地位于越南中部乂安地区。 他原名通常记作阮生恭(Nguyễn Sinh Cung),一生曾使用过多个名字和化名,其中著名的还有“阮爱国”。后来,“胡志明”成为他最为人熟知的名字。 他既是越南民族独立运动的重要领导者,也是一名共产主义革命者,并参与创建和领导后来成为越南共产党核心来源的政治组织。1945年以后,他长期担任越南民主共和国领导人,直到1969年去世。 理解胡志明有一个很重要的地方: 民族主义者和共产主义者这两个身份,在他身上并不矛盾。 他的政治目标一方面是结束法国殖民统治、建立独立的越南国家;另一方面,他又受到马克思主义和国际共产主义运动的深刻影响。 这两条线最终结合到了一起。 四、法国殖民统治与胡志明的革命道路 19世纪后半叶以后,越南逐渐被法国纳入殖民体系,并成为法属印度支那的一部分。 年轻的胡志明后来离开越南,曾长期生活和活动于法国、苏联、中国等地,并接触社会主义和共产主义运动。 1920年前后,他参与法国共产党早期活动。1930年前后,他又参与推动越南共产主义组织的整合。1941年返回越南后,他成为**越南独立同盟会——越盟(Việt Minh)**的重要领导人。 此时,一个巨大的历史机会出现了。 第二次世界大战期间,日本势力进入法属印度支那。1945年日本战败以后,原来的殖民统治体系出现权力真空。 越盟发动了后来被称为**“八月革命”**的政治行动。 五、1945年:胡志明宣布越南独立 1945年9月2日,胡志明在河内宣布成立: …

小米蕉:个头不大,却香甜浓郁的“小香蕉”

在水果摊或超市里,我们有时会看到一种比普通香蕉小很多的香蕉:果实短小,果皮金黄,一两口就能吃掉一根,成熟后香气很浓,味道也往往比普通香蕉更甜。它通常被叫作——小米蕉。 不过,“小米蕉”这个名字看似简单,背后其实有一点复杂。它并不像“苹果”或“梨”那样对应一个十分明确的植物学物种,而更多是一个商品名和民间名称。 小米蕉究竟是什么? 香蕉属于芭蕉科、芭蕉属(Musa)。我们日常食用的香蕉并不是一个单一品种,而是经过长期栽培形成的大量品种和品系。 “小米蕉”通常指的是一类果实较小的鲜食香蕉。它们共同的特点是植株结出的香蕉比较短小,单果通常明显小于超市里最常见的大香蕉。 因此,严格地说: “小米蕉”不是一个全球统一的植物学品种名称,而更接近市场上对小型香蕉的俗称。 不同地区销售的“小米蕉”,实际品种可能并不完全相同。这也是为什么有时候我们会看到“小米蕉”“皇帝蕉”“贡蕉”“小香蕉”等名称混用。 为什么叫“小米蕉”? 这里的“米”并不是说这种香蕉和小米有什么亲缘关系。 “小米蕉”这个名字主要是在强调它的小巧。与普通香蕉相比,小米蕉通常更加短小,一整把香蕉看起来密密地排列在一起,因此形成了“小米蕉”这样的商品名称。 它并不是“用小米培育出来的香蕉”,也并不是香蕉与其他植物杂交形成的特殊水果。 小米蕉为什么通常特别甜? 香蕉成熟过程中会发生一个很重要的变化:淀粉逐渐转化成糖。 没有成熟的香蕉含有较多淀粉,所以吃起来比较硬,也没有那么甜。随着香蕉成熟,果实中的酶开始分解淀粉,生成葡萄糖、果糖和蔗糖等可溶性糖。 因此香蕉会经历一个非常明显的变化: 青涩、坚硬 → 逐渐变软 → 香气增强 → 甜度明显增加。 小米蕉本身属于适合鲜食的小型香蕉,再加上果实比较小,成熟之后常常给人一种甜度特别集中、香气特别明显的感觉。 这也是很多人第一次吃小米蕉时会觉得:“怎么这么小,却比普通香蕉还香?” 它和普通香蕉有什么区别? 我们在超市最常见的大型香蕉,很多属于国际商业香蕉中非常普遍的一类,特点是果实大、运输性能好、产量高,而且成熟程度比较容易控制。 小米蕉则通常更加小巧。 从食用体验来说,小米蕉常见的特点是果肉细腻、甜度较高、香气浓、入口柔软。普通大香蕉的口感则通常更加均衡,果肉厚,单根重量更大。 但这里需要强调一点:香蕉的口感很大程度上还受到品种和成熟程度影响。 同样叫“小米蕉”的香蕉,如果来自不同产地、属于不同品种,吃起来也可能差异很大。 小米蕉和粉蕉是一回事吗? 通常不能简单画等号。 这两个名称在民间和水果市场上都存在比较明显的地域差异,但从典型口感来看,两者通常还是有所区别。 小米蕉最突出的特点一般是: 小、甜、香、软。 而很多人所说的“粉蕉”,最大的特色则是果肉带有一种明显的: 粉、糯、绵密感。 有些粉蕉吃起来甚至有一点类似栗子、熟红薯或者粉糯水果的质感,而不是普通香蕉那种单纯柔软顺滑的感觉。 因此,如果一种香蕉特别短小、香甜,通常容易被归入“小米蕉”一类;如果它短粗,而且有非常明显的粉糯口感,人们往往更容易称它为“粉蕉”。 不过,因为水果市场上的商品名并没有严格统一,所以现实中仍然可能出现名称交叉。 小米蕉和“皇帝蕉”又是什么关系? 这是最容易混淆的一组名称。 在一些市场上,小米蕉、皇帝蕉、贡蕉、迷你香蕉可能被商家当作相近甚至相同的商品名称使用。 但这并不意味着世界上存在一个植物学品种,同时正式叫这四个名字。 香蕉的栽培品种非常复杂,而商业流通中的名称往往比植物分类宽泛得多。所以看到“皇帝蕉”时,不能仅凭名字就断定它一定和另一家出售的“小米蕉”属于完全相同的栽培品种。 对于普通消费者来说,与其只看名字,不如观察三个东西: 果实大小、外形,以及成熟后的口感。 这往往比商品标签上的俗称更加可靠。 小米蕉为什么不如大香蕉常见? …

波斯菊:名字来自波斯,故乡却在墨西哥?

每到夏末秋初,公园、河堤、道路两旁和郊外的花田里,经常能看到一种随风摇曳的花:细长的茎,羽毛一样纤细的叶片,顶端开着粉红、白色或深红色的花。 在中国,有人叫它波斯菊,有人叫它秋英,一些地方叫它扫帚梅、笤帚梅;到了日本,它又有一个更加常见的名字——コスモス(Cosmos)。 还有不少人会把它叫做格桑花。 这些名字,实际上共同指向了一种非常有趣的植物。 一、波斯菊到底是什么植物? 我们平时所说的波斯菊,通常指: 秋英(Cosmos bipinnatus Cav.) 它属于: 它是一种一年生草本植物。英国皇家植物园邱园的 Plants of the World Online 将 Cosmos bipinnatus 列为有效接受种,并记载其原生分布区为墨西哥。 这件事很容易让人产生疑问: 既然叫“波斯菊”,为什么不是来自波斯? 答案是:它确实和古代的波斯,也就是今天的伊朗,没有什么原产地上的关系。 它的故乡在美洲。 所以“波斯菊”是一个非常典型的——名字容易让人误解植物来源的例子。 二、它为什么叫“Cosmos”? 波斯菊的属名 Cosmos 非常有意思。 这个词来自希腊语 kosmos(κόσμος),具有“秩序、整齐、和谐、美丽”等含义。北卡罗来纳州立大学的植物资料也将 Cosmos 属名解释为源于希腊语中“有秩序、排列整齐”的含义,与花朵整齐的排列有关。 而英语里的: cosmos = 宇宙 也是从同一个希腊词演变而来的。 因此,植物的 Cosmos 和我们今天所说的“宇宙”实际上拥有共同的词源。 古希腊人把一个有秩序、有结构的世界称作 kosmos,后来这个词逐渐产生了“宇宙”的含义。 所以日本直接把波斯菊称作: コスモス 反而非常贴近它的植物学属名。 这个名字也给波斯菊增添了一点很特别的浪漫意味——一朵看起来简单的小花,名字却和“秩序、和谐、宇宙”联系在了一起。 三、“波斯菊”真的和波斯完全没关系吗? 至少从植物的原产地来看,没有关系。 波斯菊原产墨西哥,而不是西亚。 …

用时间戳统一命名 OpenClaw 对话:让 Session 列表更干净、更可管理

在长期使用 AI Agent 或本地对话系统时,Session 数量很快会增加。如果系统默认使用第一条消息、内容摘要或者自动生成的标题作为对话名称,侧边栏最终可能变成这样: 这种方式短期看很直观,但长期使用会出现几个问题: 一种简单稳定的方案是: 每次创建新 Session 时,直接使用创建时间作为 Session 名称。 例如: 一、为什么使用时间戳 推荐格式: 例如: 表示: 这种格式有几个明显优势。 首先,名称完全可预测。 任何 Session 都使用相同格式,不需要 AI 自动生成标题,也不依赖聊天内容。 其次,它天然可以排序。 文件系统式的字典顺序与时间顺序基本一致。 第三,它减少了信息暴露。 Session 列表只显示: 而不是: 对于长期运行、Web 管理界面经常打开的 Agent 来说,这一点尤其有价值。 二、Session ID 和显示名称不是同一个东西 很多对话系统内部会同时存在两层标识: 例如内部可能是: 而界面显示: 因此,一个完整的时间戳 Session 方案最好同时处理: 这样数据库、CLI 和 Web UI 看到的是同一套命名逻辑。 三、为什么不要在进入对话后再手动 /name …