NGINX try_files,不加载特定于语言的 index.html

NGINX try_files,不加载特定于语言的 index.html

我们希望当网站被访问时,我们在请求标头index.html中提供适合该语言的语言Accept-Language。问题是我们的配置似乎不起作用。

NGINX 中的配置(两行 add_header 用于调试):

    set $first_language $http_accept_language;
    if ($http_accept_language ~* '^(.+?),') {
        set $first_language $1;
    }

    set $language_suffix 'en';
    if ($first_language ~* 'fr') {
        set $language_suffix 'fr';
    }

    location / {
        root        /usr/share/nginx/html;
        add_header x-eval-lang $language_suffix;
        if (-f /index.$language_suffix.html) {
          add_header x-xxx '33';
        }
        try_files   $uri $uri/ /index.$language_suffix.html /index.html;
    }

在文件夹中我们有:

  index.html
  index.en.html
  index.fr.html

预期的行为是根据需要提供index.en.htmlindex.fr.html,但实际上提供的是index.html。我们没有x-xxx添加标题,这表明我没有正确构建文件名。

这是在 Docker 容器中运行的。

因此,在非 Dockerised NGINX 服务器中进行测试表明这应该可行,这表明由于某种原因它没有看到本地化文件。

NGINX 版本为 1.22.1

答案1

经过大量实验后,只需提供一个修改后的index指令即可解决问题(基于静态内容):

    # Alternative recipe for getting header language, taken from
    # https://www.nginx.com/resources/wiki/modules/accept_language/#alternative
    set $first_language $http_accept_language;
    if ($http_accept_language ~* '^(.+?),') {
        set $first_language $1;
    }

    set $language_suffix 'en';
    # case sensitive for language portion, so en-FR, for example,
    # will not be treated as French
    if ($first_language ~ 'fr') {
        set $language_suffix 'fr';
    }

    location / {
        root        /usr/share/nginx/html;
        index index.$language_suffix.html index.html;
        try_files   $uri $uri/ /index.html;
    }

因此,如果$language_suffix是“fr”,则该index指令解析为:

index index.fr.html index.html

顺便说一句,“Docker”容器的差异只是一种障眼法,因为进一步的测试表明 NGINX 可以提供该文件,而非 Dockerised 版本的配置方式并不完全相同。

相关内容