请教一个 nginx rewrite 指令匹配到的部分消失的问题
我想实现一个 “根据不同的 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
还是正常替换的。
求助各位这是哪里出现的问题?