我的网站服务器上 Nginx 配置了四个 server 块,其中两个同时服务于博客,搜索引擎看到的是两个内容完全相同的网站,导致 SEO 权重被分散。
解决思路
选 vue2.xyz 做主域名,将 blog.vue2.xyz 301 永久重定向到 vue2.xyz。301 是搜索引擎认可的永久转移信号,收到后会将被重定向 URL 的排名权重全部转移到目标 URL。
操作步骤
第一步:查看当前 Nginx 配置
SSH 连接服务器,查看站点配置文件:
ssh -p 2894 root@<ip>
cat /etc/nginx/sites-enabled/vue2
输出显示有四个 server 块:
| 块 | server_name | 作用 |
|---|---|---|
| 1 | vue2.xyz, www.vue2.xyz | 提供博客服务(代理到 Nuxt:3000 + FastAPI:8001) |
| 2 | chat.vue2.xyz | MyChat 聊天应用 |
| 3 | blog.vue2.xyz | 和块1内容完全一样 |
| 4 | 全部四个域名 | HTTP 443 → HTTPS 301 跳转 |
问题: 块1 和 块3 是重复的,导致搜索引擎看到两个站。
第二步:备份并修改配置
# 备份
cp /etc/nginx/sites-enabled/vue2 /etc/nginx/sites-enabled/vue2.bak
将第三个 server 块(blog.vue2.xyz)从提供服务改为 301 重定向:
server {
server_name blog.vue2.xyz;
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/vue2.xyz/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/vue2.xyz/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
return 301 https://vue2.xyz$request_uri;
}
关键点:
return 301发送永久重定向状态码$request_uri保留原始请求的路径和参数。例如用户访问blog.vue2.xyz/p/docker会跳到vue2.xyz/p/docker- 删掉了
location块和proxy_pass,因为不再需要转发流量
第三步:验证并重载 Nginx
# 测试配置语法
nginx -t
# 平滑重载(不中断现有连接)
nginx -s reload
第四步:修复 robots.txt
robots.txt 中 sitemap 链接指向了旧域名,需要更新:
# 修改前
Sitemap: https://blog.vue2.xyz/api/sitemap.xml
# 修改后
Sitemap: https://vue2.xyz/api/sitemap.xml
Nuxt 项目构建后 public/ 目录下的文件会打包进 .output/public/,所以需要同步更新服务器上的文件:
# 直接覆盖生产环境已构建的文件
ssh -p 2894 root@<ip> "cat > /root/blog/frontend/.output/public/robots.txt << 'ROBOTS'
User-agent: *
Allow: /
Sitemap: https://vue2.xyz/api/sitemap.xml
ROBOTS"
第五步:Google Search Console
- 打开 https://search.google.com/search-console
- 添加新资源 → 选择「域名」→ 输入
vue2.xyz - 验证方式:在阿里云 DNS 解析中添加 TXT 记录(记录类型 TXT,主机记录 @,记录值粘贴 Google 提供的验证码)
- 验证通过后 → 左侧菜单「Sitemaps」
- 提交 sitemap:输入
https://vue2.xyz/api/sitemap.xml - 旧的
blog.vue2.xyz资源可以删除(设置 → 删除资源)
第六步:Nginx 添加百度验证文件直读规则
百度验证根域名时默认给的是 HTML 文件验证(不是 DNS TXT 记录)。需要把验证文件放到服务器上,且能被访问到。
但 Nuxt 运行时不会实时加载 .output/public/ 目录下新增的文件(构建后才生效),所以需要在 Nginx 中添加一条规则让 Nginx 直读验证文件:
location ~ ^/baidu_verify_ {
root /root/blog/frontend/.output/public;
}
这条正则匹配规则要放在 location / 之前,这样访问 https://vue2.xyz/baidu_verify_xxx.html 时 Nginx 直接返回文件内容,不会走到 Nuxt 层。
第七步:百度搜索资源平台
- 打开 https://ziyuan.baidu.com/ → 登录百度账号
- 用户中心 → 站点管理 → 添加网站
- 输入
https://vue2.xyz - 选择 「不带有 www」(根域名)
- 验证方式选 「HTML 文件验证」 → 下载验证文件
- 将文件上传到服务器(参考第六步的 Nginx 规则),同时本地
frontend/public/也保留一份用于后续构建 - 点 「完成验证」
- 提交 sitemap:普通收录 → 输入
https://vue2.xyz/api/sitemap.xml
注意: 百度对新站有 sitemap 提交配额限制,第一天配额通常为 0。不过没关系,因为 robots.txt 中的 Sitemap 指向百度爬虫会自动发现,配额放开后再补提交即可。
第八步:Bing Webmaster Tools
- 打开 https://www.bing.com/webmasters/
- 用微软账号登录(支持 GitHub 账号)
- 添加网站 → 输入
https://vue2.xyz - 推荐验证方式:点击 「导入」 → 关联 Google Search Console → 一键同步验证和 sitemap(最简单,不需要额外操作)
- 导入后检查 Sitemaps 页面确认 sitemap 已自动提交
清理旧验证文件
更换域名后,服务器上可能残留旧域名的百度验证文件(baidu_verify_codeva-*.html)。需要排查清理:
# 本地
rm frontend/public/baidu_verify_codeva-*.html
# 服务器(注意两个目录都要检查)
ssh -p 2894 root@服务器IP "rm /root/blog/frontend/.output/public/baidu_verify_codeva-*.html"
ssh -p 2894 root@服务器IP "rm /root/blog/frontend/public/baidu_verify_codeva-*.html"
验证重定向是否生效
curl -sI -o /dev/null -w "%{http_code} %{redirect_url}" https://blog.vue2.xyz/
# 输出: 301 https://vue2.xyz/
curl -sI -o /dev/null -w "%{http_code} %{redirect_url}" https://blog.vue2.xyz/p/some-article
# 输出: 301 https://vue2.xyz/p/some-article
涉及的知识点(经验总结)
1. Nginx server_name 匹配逻辑
Nginx 通过请求头中的 Host 字段匹配 server_name,选择对应的 server 块处理请求。匹配优先级:精确匹配 > 通配符开头 > 通配符结尾 > 正则。
2. 301 vs 302 重定向
| 状态码 | 含义 | SEO 影响 |
|---|---|---|
| 301 | 永久重定向 | 传递全部权重,搜索引擎用目标 URL 替换原 URL |
| 302 | 临时重定向 | 不传递权重,搜索引擎保留原 URL |
3. `$request_uri` 变量
Nginx 内置变量,包含原始请求的完整 URI(路径 + 查询参数),用于在重定向时保留用户访问的具体页面路径。
4. 验证配置并平滑重载
nginx -t # 仅测试语法,不应用
nginx -s reload # 热重载,不中断现有连接
5. DNS TXT 记录验证
用于证明域名所有权。在域名 DNS 解析中添加一条 TXT 记录,记录值包含搜索引擎提供的验证码。根域名(裸域)使用 @ 作为主机记录。
6. 搜索引擎处理 301 的时间
Google 通常需要 1-4 周完成权重迁移,期间旧 URL 可能仍有流量。
7. Nuxt 静态文件与 Nginx 直读
Nuxt 构建后 public/ 文件打包进 .output/public/,但运行时不会扫描目录变化。手动放入的文件需要通过 Nginx 直读:
location ~ ^/baidu_verify_ {
root /root/blog/frontend/.output/public;
}
使用正则 ~ 匹配路径前缀,多个验证文件共用一条规则。注意必须放在 location / 之前,因为 Nginx 先匹配最长前缀,正则按文件顺序匹配。
8. 百度 sitemap 配额限制
百度对新站有每日 sitemap 提交上限。第一天配额通常为 0,需要等待百度评估站点质量后逐步放开。robots.txt 中的 Sitemap 声明可以让百度自动发现 sitemap,不依赖手动提交。
9. 各搜索引擎验证方式对比
| 平台 | 根域名验证方式 | 子域名验证方式 |
|---|---|---|
| Google Search Console | DNS TXT 记录 | DNS TXT / HTML 文件 / meta 标签 |
| Bing Webmaster Tools | DNS TXT 记录 | 支持从 Google 一键导入 |
| 百度搜索资源平台 | HTML 文件验证 | DNS TXT / HTML 文件 |
经验总结
- 开发早期就决定主域名,避免后续迁移的麻烦
- 301 比 rel="canonical" 更强硬,前者直接告诉搜索引擎"这里不存在了,去那边",后者只是建议
- robots.txt、sitemap 等文件中的域名要一起更新,容易遗漏
- 配置 Nginx 前先备份,养成习惯
nginx -t && nginx -s reload两个命令连用,安全更新配置- 静态文件区分源目录和构建产物目录 — Nuxt 的
public/和.output/public/是两回事,部署后手动改文件要两个目录都检查 - 百度根域名默认用 HTML 文件验证(而非 DNS TXT),需要 Nginx 加直读规则绕过 Nuxt 运行时限制
评论
暂无评论,来写第一条吧
