WPML
状态
已解决
报告针对
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 引起的行为差异和问题。

所有已知问题 →