SEO 域名统一:谷歌必应301 重定向操作全记录

2026年6月27日 blogTech 11 分钟阅读 3 次阅读
📖 文章摘要

我的网站服务器上 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

  1. 打开 https://search.google.com/search-console
  2. 添加新资源 → 选择「域名」→ 输入 vue2.xyz
  3. 验证方式:在阿里云 DNS 解析中添加 TXT 记录(记录类型 TXT,主机记录 @,记录值粘贴 Google 提供的验证码)
  4. 验证通过后 → 左侧菜单「Sitemaps」
  5. 提交 sitemap:输入 https://vue2.xyz/api/sitemap.xml
  6. 旧的 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 层。

第七步:百度搜索资源平台

  1. 打开 https://ziyuan.baidu.com/ → 登录百度账号
  2. 用户中心 → 站点管理 → 添加网站
  3. 输入 https://vue2.xyz
  4. 选择 「不带有 www」(根域名)
  5. 验证方式选 「HTML 文件验证」 → 下载验证文件
  6. 将文件上传到服务器(参考第六步的 Nginx 规则),同时本地 frontend/public/ 也保留一份用于后续构建
  7. 「完成验证」
  8. 提交 sitemap:普通收录 → 输入 https://vue2.xyz/api/sitemap.xml

注意: 百度对新站有 sitemap 提交配额限制,第一天配额通常为 0。不过没关系,因为 robots.txt 中的 Sitemap 指向百度爬虫会自动发现,配额放开后再补提交即可。

第八步:Bing Webmaster Tools

  1. 打开 https://www.bing.com/webmasters/
  2. 用微软账号登录(支持 GitHub 账号)
  3. 添加网站 → 输入 https://vue2.xyz
  4. 推荐验证方式:点击 「导入」 → 关联 Google Search Console → 一键同步验证和 sitemap(最简单,不需要额外操作)
  5. 导入后检查 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 文件

经验总结

  1. 开发早期就决定主域名,避免后续迁移的麻烦
  2. 301 比 rel="canonical" 更强硬,前者直接告诉搜索引擎"这里不存在了,去那边",后者只是建议
  3. robots.txt、sitemap 等文件中的域名要一起更新,容易遗漏
  4. 配置 Nginx 前先备份,养成习惯
  5. nginx -t && nginx -s reload 两个命令连用,安全更新配置
  6. 静态文件区分源目录和构建产物目录 — Nuxt 的 public/.output/public/ 是两回事,部署后手动改文件要两个目录都检查
  7. 百度根域名默认用 HTML 文件验证(而非 DNS TXT),需要 Nginx 加直读规则绕过 Nuxt 运行时限制
最后更新:2026年6月29日CC BY-NC-SA 4.0

评论

暂无评论,来写第一条吧

© 2026 My Blog. Built with Nuxt.js + FastAPI.