我们希望当网站被访问时,我们在请求标头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.html
或index.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 版本的配置方式并不完全相同。