三个站长平台跑一遍:验证、sitemap 和 IndexNow
百度验证方式是往 <head> 里塞一个 meta:
<meta name="baidu-site-verification" content="codeva-xxxxxxx" />
Butterfly 有现成的位置,_config.butterfly.yml 的 inject.head 里加一行:
inject: head: - <meta name="baidu-site-verification" content="codeva-xxxxxxx" />
验证过了之后提交 sitemap,会看到一个意料之外的东西:配额 0。
sitemap 提交页 0,API 提交页也是 0。
新站就是这样。配额按站点信用动态给,要等收录几十篇之后才会涨上去。
但它限制的只是「你主动推」这一条路。robots.txt 里写好了 Sitemap: 声明,蜘蛛正式抓取之前一定会先读 robots.txt,读到就会来找——这条路不占配额。
顺带还遇到一次抓取诊断报 DNS无法解 ...
标签大小写引发的连锁反应:从 sitemap 死链到 git 不改名
起因sitemap 提交给 Google 之后一直显示「无法抓取」。用 Googlebot 的 UA 去取是 200,干脆把 225 条 URL 全跑一遍,揪出 8 条 404:
/404.html/tags/Docker/ /tags/DOCKER/ /tags/Java//tags/kotlin/ /tags/python/ /tags/hexo/ /tags/nginx/
/404.html 是另一回事(nginx 里设成了 internal,本来就不该进 sitemap)。先说那 7 个标签页。
目录名对不上对着服务器挨个查:
sitemap 写 Docker → 服务器上是 dockersitemap 写 Java → 服务器上是 JAVAsitemap 写 kotlin → 服务器上是 Kotlin
每个都差一层大小写,而且新旧一一对应。
根子在文章的 front-matter。同一个东西,有的写 Docker,有的写 DOCKER,有的写 docker。Hexo 把它们当成三个不同的标签,生成三个目录。
三个目录在本地是同一个因为我在 W ...
www 打不开:一张证书和两个 server 块
现象www.cyk.pink 打不开,浏览器直接报证书错误。点「继续访问」之后又能看到完整站点。
先查再改我一开始以为是 DNS 没做。查完发现想错了:
DNS www.cyk.pink → 43.143.218.149 正常80 端口 → 301 https://cyk.pink/ 正常443 server_name cyk.pink www.cyk.pink 两个域名同一个块证书 SAN DNS:cyk.pink 没有 www
两个问题叠在一起:证书不认 www,443 又把 www 和主域塞进同一个 server 块。所以用户在证书警告页点继续之后,看到的是同一个站。
同一份内容挂在两个域名下,这才是要修的地方。
扩证书失败sudo certbot --nginx -d cyk.pink -d www.cyk.pink --expand
Domain: www.cyk.pinkDetail: During secondary validation: T ...
sitemap、robots 和结构化数据:静态博客的收录地基
起点92 篇文章,site:cyk.pink 一条结果都没有。
不是排名差,是搜索引擎不知道有这么一个站。查了一下,sitemap、robots、feed 三个地址全是 404,站长平台一个都没提交过。三年里我做完 hexo deploy 就关浏览器。
先看已经有什么免得重复劳动:
项目
结果
http → https
301
404 页面
真 404
canonical / og / article meta
有
gzip
开
sitemap / robots / feed
全 404
ld+json
无
站点描述
「我是CYK」
前三行是之前折腾 nginx 时顺手做好的,不用再碰。
sitemap 和 feednpm i hexo-generator-sitemap hexo-generator-feed
sitemap: path: sitemap.xml tags: true categories: truefeed: type: atom path: atom.xml limit: ...
把 Butterfly 的代码块改成极简样式
原来的样子左上角三个圆点,右边一个大写加粗的语言名,还带一圈投影。做演示截图够用,放在正经文章里太吵。
highlight_theme: mac 关掉的只是配色,那三个圆点是写死在 CSS 里的。
圆点不是三个 div是一个伪元素,用 box-shadow 投出来的:
#article-container figure.highlight .highlight-tools:after { position: absolute; left: 14px; width: 12px; height: 12px; border-radius: 50%; background: #fc625d; box-shadow: 20px 0 #fdbc40, 40px 0 #35cd4b; content: ' ';}
一个红点靠 box-shadow 投出黄绿两个。所以关掉就是让它没有内容:
#article-container figure.highlight .highlight-tools:after { content: no ...
评论区加载不出来?把 Twikoo 从 Vercel 搬回自己服务器
现象博客的评论区一直在转圈,一直以为是「没人评论所以空的」。
直到有一天为了查别的问题去调评论接口,发现请求根本没回来:
curl -X POST https://xxx.vercel.app/ → 超时
第一步:先看 DNS,别急着改代码nslookup xxx.vercel.app
结果:
Addresses: 2a03:2880:f12c:183:face:b00c:0:25de 31.13.85.2
face:b00c 是 Facebook 的 IPv6 特征段,31.13.x 也是 Facebook 的地址块。再查一个对照组:
nslookup vercel.com → 64.239.123.1 ✅ 正常nslookup test.vercel.app → 208.43.170.231 + face:b00c ❌ 同样被劫持
结论:***.vercel.app 整段被 DNS 污染**,解析结果全被指到 Facebook 的 IP 上,所以永远连不上。Vercel 本身没问题,vercel.com 是好的。
这也解释了为 ...
静态博客的传输层优化:HTTP/2、gzip 和缓存头
先量化,再优化重装之后顺手给站点做了一次体检,四个数字最扎眼:
指标
数值
HTTPS
只有 HTTP/1.1
gzip
只压 HTML,CSS/JS 全裸奔
图片缓存头
没有
图床里没人引用的死图
40 个,占 6.5MB / 8.9MB
前三个都是 nginx 一行配置的事,最后一个是长期积累的垃圾。
HTTP/2:一个连接跑完所有资源HTTP/1.1 的问题是「一个连接同时只能处理一个请求」,浏览器只能靠开 6 个并发连接硬堆。页面有几十个资源的时候,排队是实打实的延迟。
开启只需要在 listen 后面加一个词:
listen 443 ssl http2;
验证别只看配置,要实际协商:
echo | openssl s_client -connect 127.0.0.1:443 -servername 你的域名 -alpn h2 2>/dev/null \ | grep -i "ALPN protocol"
看到 ALPN protocol: h2 才算真的开了。
gz ...
重装只是开始:把公网服务器从裸奔状态拉回来
重装之后的第一件事不是装软件系统重装完,ssh root@ip 一通,密码进去——这一步就已经错了。
上一台机器出事,本质就是「密码可以被人猜」。所以这次第一件事是:把密码登录这条路彻底关掉,改成密钥。
SSH 换密钥本地生成一对 ed25519(比 RSA 短、比 RSA 快、强度还更高):
ssh-keygen -t ed25519 -f ~/.ssh/cyk_server -N ""
把公钥追加到服务器的 ~/.ssh/authorized_keys,权限必须是这套:
chmod 700 ~/.sshchmod 600 ~/.ssh/authorized_keys
然后写一份加固配置,放在 sshd_config.d/ 下(注意文件名要排在云厂商的默认配置前面,因为 sshd 是「先读到的生效」):
PasswordAuthentication noKbdInteractiveAuthentication noPermitRootLogin prohibit-passwordMaxAuthTries 3
prohibit-password 的意思不是「允 ...
服务器被拿去当肉鸡:一次入侵的完整复盘
起因一直挺得意那台轻量服务器——2 核 4G,跑着博客、图床、一个文件管理,两年没出过事。
10 月 26 号晚上翻图床的时候发现不对劲:桶里多了几个从来没上传过的文件,名字是 shell.php、.htaccess,还有一个叫 ahk_probe 的东西。第一反应是自己手滑,第二反应是——我根本没开过 PHP。
往下挖先看的不是网站,是进程。
ps auxf | grep -v '\['
排在最上面的几个进程看着很正常,名字是系统自带的那种。但路径不对:
/dev/shm/.collector/collector.d
/dev/shm 是内存盘,重启就清空,正常服务不会往这儿放东西。collector.d 这个名字起得很「正经」,伪装成日志收集器——这种命名习惯不是随手写的,是有人专门研究过怎么不被人一眼看出来。
再看 /root/.ssh/,authorized_keys 里多了一把不属于我的公钥。也就是说:对方不需要密码也能随时回来。
溯源:入口在哪翻 nginx 和 MinIO 的日志,链条很清楚:
图床的 9000 端口直接对着公网开着
MinIO ...
oh-my-posh:一个好看的终端提示符怎么装
oh-my-posh 是个跨平台的终端提示符美化工具,支持 PowerShell、bash、zsh、fish、cmd。它用 JSON 配置文件定义提示符长什么样,可以显示当前目录、git 分支、执行时间、电池、天气、各种编程语言版本等。
安装Windows 上最方便的是用 winget:
winget install JanDeDobbeleer.OhMyPosh
装完会多出一个 oh-my-posh.exe。macOS 和 Linux 可以用 Homebrew:
brew install jandedobbeleer/oh-my-posh/oh-my-posh
或者直接用官方安装脚本:
curl -s https://ohmyposh.dev/install.sh | bash
字体oh-my-posh 的很多主题用到 Nerd Font 图标。如果看到方块或乱码,说明当前字体没有这些字形。
推荐装 MesloLGM Nerd Font 或 Cascadia Code PL。Windows Terminal 里在设置 → 外观 → 字体里选上。VS Code 终端同样要在 se ...
