<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Debugging · XB 现场笔记</title><link>https://www.xbcatm.com/zh/tags/debugging/</link><description>基于 HTTP、DNS、TLS、Caddy、SSH、发布与恢复的可复现运维现场笔记。</description><generator>Hugo</generator><language>zh-CN</language><atom:link href="https://www.xbcatm.com/zh/tags/debugging/index.xml" rel="self" type="application/rss+xml"/><item><title>用两条命令读取公共边缘</title><link>https://www.xbcatm.com/zh/notes/read-the-public-edge-in-two-commands/</link><pubDate>Mon, 24 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.xbcatm.com/zh/notes/read-the-public-edge-in-two-commands/</guid><description>对活动站点运行只读探针，让响应头与证书日期确认你以为部署的东西。</description><content:encoded>&lt;p&gt;一次部署，是当公共边缘与你选择的文件一致时才完成，而不是因为最后一条上传命令退出码为零。操作套件里的两个只读小工具，能让任何能到达主机的机器看到这种一致性。&lt;/p&gt;
&lt;h2 id="检查响应头"&gt;检查响应头&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;check-http-headers.sh&lt;/code&gt; 抓取一个 URL，并打印响应行、响应头与重定向后的最终 URL：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;check-http-headers.sh https://www.xbcatm.com/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最近对本站一次运行的结果：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;HTTP/2 200
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;server: nginx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;content-type: text/html; charset=utf-8
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;content-security-policy: default-src &amp;#39;self&amp;#39;; script-src &amp;#39;none&amp;#39;; ...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;strict-transport-security: max-age=31536000; includeSubDomains
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x-content-type-options: nosniff
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注意正文被丢弃，只显示响应线之外的状态行。要比较一次发布前后的变化，保存一份基线并把新的输出与之相减。&lt;/p&gt;
&lt;h2 id="读取证书日期"&gt;读取证书日期&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;check-tls-expiry.sh&lt;/code&gt; 从 TLS 握手读取服务器证书的过期日期，而不改变服务：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;check-tls-expiry.sh www.xbcatm.com &lt;span class="m"&gt;30&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;它打印证书的 &lt;code&gt;notAfter&lt;/code&gt; 以及到该日期剩余的天数。如果剩余天数低于阈值，它以非零状态退出——适合加进发布冒烟测试。&lt;/p&gt;
&lt;h2 id="发布冒烟测试里它们配合使用"&gt;发布冒烟测试里它们配合使用&lt;/h2&gt;
&lt;p&gt;排定发布冒烟测试时，让一个命令确认法着陆状态，另一个确认即将过期的证书。剩下的剩余风险是活动报表之外、真正浏览无法发现的内容——例如重量级第三方脚本，或是仅在大流量出现的缓存问题。一条只读输出现场完成不了这些，仍需一次真实的浏览器会话。&lt;/p&gt;
&lt;h2 id="来源"&gt;来源&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc9110.html"&gt;RFC 9110 — HTTP Semantics&lt;/a&gt;，响应语义与条件请求，已核验 2026-08-24。&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.openssl.org/3.0/man1/openssl-s_client/"&gt;OpenSSL &lt;code&gt;s_client&lt;/code&gt;&lt;/a&gt;，TLS 连接与证书日期检查，已核验 2026-08-24。&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.xbcatm.com/zh/resources/"&gt;制品 HTTP 响应头检查&lt;/a&gt;，贯穿本记录使用的只读检查。&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>重定向与错误码应保留故事的完整性</title><link>https://www.xbcatm.com/zh/notes/redirects-and-error-codes-should-preserve-the-story/</link><pubDate>Sat, 22 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.xbcatm.com/zh/notes/redirects-and-error-codes-should-preserve-the-story/</guid><description>用永久重定向与缺失类状态码描述发生了什么，而不是隐藏一条坏路由。</description><content:encoded>&lt;p&gt;HTTP 状态码是接口的一部分。浏览器可能渲染出一个友好的页面，但监控、爬虫、缓存与 API 客户端也需要状态码与响应头来讲述同一个故事。&lt;/p&gt;
&lt;h3 id="永久移动并不都等价"&gt;永久移动并不都等价&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;308 Permanent Redirect&lt;/code&gt; 在保留请求方法的同时，传达资源有了新的永久 URI。这对发送 &lt;code&gt;POST&lt;/code&gt;、&lt;code&gt;PUT&lt;/code&gt; 或其他非 &lt;code&gt;GET&lt;/code&gt; 方法的客户端很重要。旧页面到新页面的重定向用 &lt;code&gt;GET&lt;/code&gt; 很容易测试；端点的迁移则必须用真实调用方实际使用的方法来测试。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -sS -D - -o /dev/null --max-redirs &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; https://old.example.test/api/item
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;检查 &lt;code&gt;Location&lt;/code&gt; 是否为绝对地址或正确锚定、目标是否是预期主机，以及响应是否被静默降级为临时重定向。&lt;code&gt;308&lt;/code&gt; 默认可缓存，因此只有在有意识的迁移计划时才改动它。&lt;/p&gt;
&lt;h3 id="区分缺失与被移除"&gt;区分&amp;quot;缺失&amp;quot;与&amp;quot;被移除&amp;quot;&lt;/h3&gt;
&lt;p&gt;当服务器找不到当前表示且缺失可能是暂时或未知时，使用 &lt;code&gt;404 Not Found&lt;/code&gt;。&lt;code&gt;410 Gone&lt;/code&gt; 更强：它表示资源被有意移除且不太可能回归。两者都应有帮助人类的正文，但都不应因为自定义错误页成功渲染就返回 &lt;code&gt;200&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这条检查应放在边缘：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -sS -o /tmp/missing.html -w &lt;span class="s1"&gt;&amp;#39;%{http_code} %{url_effective}\n&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; https://www.example.com/a-route-that-does-not-exist
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在错误路径上也应保留安全响应头。安全头、有用的内容类型与正确的状态码，比一个装饰性的错误动画更有价值。&lt;/p&gt;
&lt;h2 id="来源"&gt;来源&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc9110.html"&gt;RFC 9110 — HTTP Semantics&lt;/a&gt;，第 15 与 13 节，已核验 2026-08-22。&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc7538.html"&gt;RFC 7538 — 308 Permanent Redirect&lt;/a&gt;，第 3 节，已核验 2026-08-22。&lt;/li&gt;
&lt;li&gt;&lt;a href="https://curl.se/docs/manpage.html"&gt;curl manual&lt;/a&gt;，状态与重定向检查标志，已核验 2026-08-22。&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item></channel></rss>