WordPress非ASCII字符URL(中文URL)无法被正确重写或访问

ptd 发布于 2025-12-20 90 次阅读


引言

伪静态(Pseudo-static)是一种网站优化技术,它通过URL重写规则,将原本包含参数的动态网址(例如 example.com/index.php?id=1)转换为类似静态页面的简洁格式(例如 example.com/article/1.html)。

它的核心原理是:当用户访问这个“静态”URL时,服务器会根据预先配置的规则(如Apache的mod_rewrite模块或Nginx的rewrite指令)将其重新映射回对应的动态脚本进行处理,最终生成并返回页面内容。因此,伪静态页面本质上仍是动态生成的,并非服务器上真实存在的静态HTML文件。

这项技术的主要目的是提升搜索引擎优化(SEO)效果和用户体验。简洁、可读性高的URL更受搜索引擎青睐,也更容易被用户记忆和分享。不过,它也会消耗与动态页面相当的服务器资源,在高并发场景下可能增加服务器负担。

问题定位与解决方案

首先我们需要确定服务器类型,如果你的部署方式也是虚拟主机,或者自己并不确定服务器类型,可以使用https://securityheaders.com/(安全标头)进行查询,在Raw HeadersServer处查看服务器信息。

对于WordPress和Apache服务器,常用的伪静态规则如下(一般保存在WordPress根目录下的.htaccess文件中):

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

在WordPress中,我们是通过常用设置中的固定链接来自定义URL结构,如下图所示:

如果选择像“朴素”、“数字型”这类结构本身不带中文的固定连接,也就不存在编码/解码问题,默认的伪静态规则即可生效,但当我们选择“文章名 / 自定义结构”这类可能带中文 URL的固定链接时,Apache 先拿到的是 URL-encoded 形式/%e6%97%a0%e6%88%90),再次编码后,WordPress 拿到的 REQUEST_URI 就是双重编码,匹配不到数据库里的原始中文 slug,于是 404。

产生这类问题的主要原因是Apache的mod_rewrite模块在处理包含URL编码(如%e6%97%a0%e6%88%90)的中文路径时的默认行为。

解决方案一:

直接在文章/页面编辑处修改别名将固定链接改为英文URL:

解决方案二:

需要修改WordPress根目录下的.htaccess文件,在现有的重写规则中添加特定的标志(flags),以正确处理编码字符:

  • 添加 B 标志:此标志会强制重写引擎对匹配规则的反向引用(如 (.*))进行二次URL编码,这有助于处理非ASCII字符。
  • 添加 NE 标志:此标志阻止重写引擎对替换后的URL进行再次编码,避免出现双重编码问题。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L,B,NE]
</IfModule>

说明:

由于我的部署方式是虚拟主机,只能跑 PHP/静态等预设环境,改不了全局配置,而且经检查,我的服务器类型为Kangle Web Server 3.5,Kangle 对中文URL支持较差,上述修改文件的方法无效。如果是这种与我类似的情况请联系虚拟主机客服,说明问题(Apache重写规则无法处理URL编码的中文路径),询问他们是否支持或能协助修改服务器配置。

此作者没有提供个人介绍。
最后更新于 2025-12-20