我遇到了一个奇怪的问题。Nginx 正在按字母顺序重新排序查询参数,而不是按请求的顺序。
例如,如果我提供一个 URL:
https://example.com/?a[]=c&a[]=a&a[]=b
我希望$query_string
是:
a[]=c&a[]=a&a[]=b
但我得到了
a[]=a&a[]=b&a[]=c
我们使用 Nginx 作为代理,将所有类型的 URL/子域路由到不同类型的应用程序。通常,这在大多数现代应用程序上不会成为问题,但我们使用了一些旧版应用程序(我们无法更改其代码),当查询的顺序不符合预期时,这些应用程序就会中断。
当前代理的 .conf 非常简单:
# Get the application private IP from the name #
map_hash_bucket_size 128;
map $host $task_url {
include /etc/nginx/service-mappings.conf;
}
server {
listen 80;
server_name *.example.com;
if ($task_url = false) {
return 404 "Service was not mapped.";
}
location ~ /(.*) {
add_header X-QueryParams $1$is_args$args; # Is not outputting correct value
add_header X-TaskUrl $task_url;
proxy_pass http://$task_url/$1$is_args$args;
proxy_set_header Host $host;
proxy_pass_request_headers on;
}
error_log /var/log/nginx/service-mapper.log;
}
答案1
这不是 Nginx 的问题。
我们已经Query String Sort
在CloudFlare中启用了。
我们设置了一个页面规则来仅针对这些域禁用此功能,并且它起作用了。