- 状态
- 已解决
- 报告针对
- WPML Multilingual CMS 3.2.7
- 解决于
- 3.3
问题概述
当在域和插件中使用语言时,如果其输出依赖于对 home_url() 函数的正确过滤,以在链接中替换为网站主页 URL 的正确语言版本,那么链接可能会显示不正确。在大多数情况下,这意味着链接中使用了您的域的默认语言版本,而不是正确的次要语言版本。
此问题表现出来的另一个常见示例是,Yoast WP SEO 的 XML 站点地图在次要语言中无法正确显示,而是仅显示一个白页。
该问题本身并非由 WPML 插件引起,而是由于 Apache 和 Nginx Web 服务器之间的差异造成的。Apache Web 服务器会使用浏览器请求的主机来填充超全局变量 $_SERVER['SERVER_NAME']。Nginx 默认不会执行此操作,但也可以配置为执行此操作。
为了实现这一点,上述临时解决方法只需使用 Nginx Web 服务器提供的 $host 变量,并通过上面显示的 fastgi_param 调用将其传递给处理您的 .php 文件的 PHP-FPM 守护程序。
然后,PHP-FPM 守护程序可以通过 $_SERVER 超全局变量使用此变量,并且该设置模仿了更常见的 Apache + PHP(cgi) 设置的默认行为。
临时解决方法
在站点的 nginx 配置文件中,找到描述 .php 文件处理方式的部分。
它看起来与以下示例类似,包含一个 location 语句以及 .php 文件后缀。
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
if (!-f $document_root$fastcgi_script_name) {
return 404;
}
fastcgi_pass php;
fastcgi_keep_conn on;
fastcgi_index index.php;
}
将以下代码行
fastcgi_param SERVER_NAME $host;
添加到其中,从而在您的 $_SERVER 超全局变量中启用 SERVER_NAME 索引,如下所示:
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
if (!-f $document_root$fastcgi_script_name) {
return 404;
}
fastcgi_pass php;
fastcgi_keep_conn on;
fastcgi_param SERVER_NAME $host;
fastcgi_index index.php;
}这将使 home_url() 过滤的工作方式与在 Apache 设置中完全相同,从而解决因使用 Nginx 引起的行为差异和问题。