操作环境
服务器操作系统:Ubuntu Linux
Web 服务器:Nginx 或 Apache
Web 应用:WordPress
我使用的固定链接形态为“朴素”型,如下:
https://zhaokaifeng.com/?p=3095
问题描述
我在我的个人网站上安装了 YoastSEO, 但是开启其 XML Sitemap 功能后,访问:https://zhaokaifeng.com/sitemap_index.xml
却出现了 “404 Not Found” 的提示。
问题分析
YoastSEO 生成的 XML Sitemap 地址一般是这样的:
https://zhaokaifeng.com/sitemap_index.xml
但其实,在上面这个地址的背后,YoastSEO 生成的 XML Sitemap 的真实地址是这样的:
https://zhaokaifeng.com/?sitemap=1
因此,如果你能通过 example.com/?sitemap=1
正常打开 XML Sitemap, 那就说明你的 XML Sitemap 已经生成了,但是服务器的重写没有生效。这种情况下,我们可以使用下面的方法在 Nginx 或者 Apache 上解决该问题。
Nginx 服务器解决方案
登录服务器,进入 /etc/nginx/sites-available
目录,编辑 default
文件 (重要提示:编辑前请做好备份,以便需要时回滚数据!!!),将如下代码写入当前站点正在使用的 Server{}
块中:
#Yoast SEO Sitemaps location ~ ([^/]*)sitemap(.*).x(m|s)l$ { ## this rewrites sitemap.xml to /sitemap_index.xml rewrite ^/sitemap.xml$ /sitemap_index.xml permanent; ## this makes the XML sitemaps work rewrite ^/([a-z]+)?-?sitemap.xsl$ /index.php?yoast-sitemap-xsl=$1 last; rewrite ^/sitemap_index.xml$ /index.php?sitemap=1 last; rewrite ^/([^/]+?)-sitemap([0-9]+)?.xml$ /index.php?sitemap=$1&sitemap_n=$2 last; }
之后重启 Nginx 服务器:
service nginx restart
此时再访问 https://zhaokaifeng.com/sitemap_index.xml 就可以看到 XML 站点地图已经能够正常显示,如图 1:
Apache 服务器解决方案
如果你使用的 Web 服务器是 Apache, 则可以在 .htaccess
文件中 WordPress 重写规则的下面添加如下重写规则:
# Yoast SEO - XML Sitemap Rewrite Fix RewriteEngine On RewriteBase / RewriteRule ^sitemap_index.xml$ /index.php?sitemap=1 [L] RewriteRule ^locations.kml$ /index.php?sitemap=wpseo_local_kml [L] RewriteRule ^geo_sitemap.xml$ /index.php?sitemap=geo [L] RewriteRule ^([^/]+?)-sitemap([0-9]+)?.xml$ /index.php?sitemap=$1&sitemap_n=$2 [L] RewriteRule ^([a-z]+)?-?sitemap.xsl$ /index.php?yoast-sitemap-xsl=$1 [L] # END Yoast SEO - XML Sitemap Rewrite Fix
References:
[1]. My sitemap is giving a 404 error, what should I do? • Yoast
https://yoast.com/help/my-sitemap-is-giving-a-404-error-what-should-i-do/
[2]. Yoast XML Sitemaps on NGINX servers • Yoast
https://yoast.com/help/xml-sitemaps-nginx/
[3]. Yoast XML Sitemaps on Apache servers • Yoast
https://yoast.com/help/xml-sitemaps-apache/
EOF