我想实现一个 “根据不同的 header 中的 Accept-Language
返回不同的文件” 功能,我写的配置文件如下:
map $http_accept_language $locale {
default "en-US";
~*en "en-US";
~*zh "zh-CN";
}
server {
listen 80;
server_name _;
location / {
rewrite_log on;
rewrite ^/(.*)$ /prerendered/$locale/$1;
}
location /prerendered/en-US {
root /usr/share/nginx/html;
# try_files $uri $uri/ $uri.html /prerendered/en-US/index.html =404;
}
location /prerendered/zh-CN {
root /usr/share/nginx/html;
# try_files $uri $uri/ $uri.html /prerendered/zh-CN/index.html =404;
}
}
大体思路就是利用 map 定义一个 $locale
变量,然后 rewrite 到对应目录。
文件结构:
/usr/share/nginx/html/prerendered
├── en-US content:
│ ├── a.html a en-US
│ └── index.html index en-US
└── zh-CN
├── a.html a zh-CN
└── index.html index zh-CN
curl 命令和结果:
$ curl http://127.0.0.1/a.html
a en-US
$ curl http://127.0.0.1/a.html -H 'Accept-Language: en'
index en-US
$ curl http://127.0.0.1/a.html -H 'Accept-Language:zh'
index zh-CN
从第二个命令开始,路径就被错误地重定向到了 /prerendered/en-US/
,后面的 a.html
消失了。
nginx 对第二个命令的日志:
2020/09/09 09:45:16 [notice] 29#29: *4 "^/(.*)$" matches "/a.html", client: 172.17.0.1, server: _, request: "GET /a.html HTTP/1.1", host: "127.0.0.1"
2020/09/09 09:45:16 [notice] 29#29: *4 rewritten data: "/prerendered/en-US/", args: "", client: 172.17.0.1, server: _, request: "GET /a.html HTTP/1.1", host: "127.0.0.1"
可以看到,这个 rewrite 规则是命中了的,但是替换的时候后面的 $1
却没有替换上;而且只有 Accept-Language
包含 zh/en
才会出现,如果是 空 或者es
(默认 map 到 en ),a.html
还是正常替换的。
求助各位这是哪里出现的问题?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.