当您使用 Nginx 作为代理服务器时,将查询字符串参数从客户端传递到上游服务器(例如应用服务器)是一个很常见的需求。Nginx 默认情况下就会将请求中的查询字符串参数传递到上游服务器。这是因为当请求被代理时,整个请求行(包括 URI 和查询字符串)都会被转发。
以下是一个基本的 Nginx 配置示例,展示了如何为一个应用服务器配置代理,并自动包含查询字符串:
nginxserver { listen 80; server_name example.com; location / { # 代理设置,将请求传递到后端应用服务器 proxy_pass http://backend_server; # 下面这些是一些通用的代理设置,以确保请求和响应头被合适地处理 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
在这个配置中,proxy_pass
指令用来定义上游服务器的地址。当客户端发送请求到 Nginx 时,如果请求包含查询字符串,Nginx 将自动将整个请求 URI(包括查询字符串)转发到 http://backend_server
。
例如,如果客户端请求 http://example.com/search?q=openai&lang=en
,Nginx 会将这个请求代理到 http://backend_server/search?q=openai&lang=en
,包括查询字符串 ?q=openai&lang=en
。
如果您需要修改查询字符串或者根据查询字符串做一些特殊处理,可以使用 rewrite
指令或者 $args
变量来实现。这里是一个使用 rewrite
指令修改查询字符串的示例:
nginxserver { listen 80; server_name example.com; location / { # 检查请求的查询字符串,如果没有 lang 参数则添加 lang=en if ($args !~ "lang=") { set $args "${args}&lang=en"; } # 将修改后的请求传递到后端服务器 proxy_pass http://backend_server; # 其余代理设置... } }
在这个例子中,如果原始请求缺少 lang
参数,Nginx 将会添加 lang=en
到查询字符串,并将修改后的请求传递到上游服务器。