gpt4 book ai didi

Nginx 重写匹配,但重写数据中缺少匹配组

转载 作者:行者123 更新时间:2023-12-04 08:56:22 25 4
gpt4 key购买 nike

我正在尝试为 nginx 做一个“不同语言环境的不同路径”配置,但在这里遇到了一些奇怪的情况。在此处查看我的配置文件:

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;
}
}
所以我想要这个配置是基于不同的语言环境(默认为 en-US),nginx 应该在内部将 url 重写为不同的路径并返回不同的文件。但是,我得到的结果是这样的:
文件树:
/usr/share/nginx/html/prerendered
├── en-US content:
│ ├── a.html a en-US
│ └── index.html index en-US
└── zh-CN
├── a.html a en-US
└── 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
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"
从 Nginx 的日志中,“a.html”是匹配的,但如果提供了“Accept-Language” header ,则由于某种原因在重写的数据中丢失。我在这里做错了什么吗?

最佳答案

数字捕获被要评估的最新正则表达式覆盖。 $locale的值在 rewrite 中的正则表达式之后计算声明并因为map包含正则表达式,值$1被重置为空字符串。
通常的解决方案是使用命名捕获,例如:

rewrite ^/(?<myuri>.*)$ /prerendered/$locale/$myuri last;
您可以使用预定义变量 $uri取而代之,但请记住它已经包含一个前导 / , 例如:
rewrite ^ /prerendered/$locale$uri last;
但是,您不需要使用 rewrite ,同样的功能可以用 try_files来实现, 例如:
root /usr/share/nginx/html;
location / {
try_files $uri $uri/ /prerendered/$locale$uri =404;
}

关于Nginx 重写匹配,但重写数据中缺少匹配组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63809168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com