在 nginx 中我们一直尝试重定向 URL,如下所示:客户端点击该 URL:https://new.domain.com/reg?account.name=ABC&accountID.number=1234&OrderNumber=11111111&Code=2222
并且nginx必须将请求路由到后端tomcat。
http://localhost:8000/some_dir/reg?account.name=ABC&accountID.number=1234&订单号=11111111&代码=2222。
服务器配置如下:
server {
listen 80;
listen [::]:80;
server_name localhost;
location ~ ^/reg?(.*) {
resolver x.x.x.x;
proxy_pass http://localhost:8000/some_dir/reg?$1;
}
通过上述设置,我可以看到从浏览器访问时请求到达了后端 tomcat。但是,“reg?” 之后的 URI 字符串(即:)"account.name=ABC&accountID.number=1234&OrderNumber=11111111&Code=2222"
没有得到定向。
有人能帮我指出正则表达式的错误吗?
答案1
这里的问题是仅匹配 URL 的路径部分。因此,正如所写的那样location
,您的正则表达式匹配的 URL 比您预期的要多得多。例如,它匹配/re
、以及。但它/redwood
/regular
/reg
才不是将查询字符串放在捕获中,因为查询字符串不是路径组件的一部分。
幸运的是,您根本不需要正则表达式,也不需要捕获查询字符串,因为 nginx 已经跟踪了它。考虑一下:
location /reg {
proxy_pass http://localhost:8080/some_dir/reg$is_args$args;
}
这里我们去掉了所有无关的匹配,只匹配以 开头的 URL 路径/reg
。您可以使用 来使其更具体location = /reg
。然后我们明确传递参数。