用nginx怎么转发查询参数?

upstream apache { server 127.0.0.1:8080; } server{ location ~* ^/service/(.*)$ { proxy_pass http://apache/$1; proxy_redirect off; } } 

上面的代码段将redirect部分请求中包含string“服务”的请求到另一台服务器,但不包括查询参数。

从proxy_pass文档:

一个特殊情况是在proxy_pass语句中使用variables:所请求的URL未被使用,您完全有责任自己构build目标URL。

既然你在目标中使用了$ 1,nginx依靠你来告诉它到底要传递什么。 你可以用两种方法解决这个问题。 首先,用proxy_pass剥离uri的开始是微不足道的:

 location /service/ { # Note the trailing slash on the proxy_pass. # It tells nginx to replace /service/ with / when passing the request. proxy_pass http://apache/; } 

或者,如果你想使用正则expression式的位置,只需包含参数:

 location ~* ^/service/(.*) { proxy_pass http://apache/$1$is_args$args; } 

我用一个稍微修改过的kolbyjack的第二种方法来代替~*

 location ~ ^/service/ { proxy_pass http://apache/$uri$is_args$args; } 

我修改了@kolbyjack代码,使其工作

 http://website1/service http://website1/service/ 

带参数

 location ~ ^/service/?(.*) { return 301 http://service_url/$1$is_args$args; } 

你必须使用重写使用proxy_pass传递参数这里是我为angularjs应用程序部署到S3的例子

S3静态网站托pipepath到Index.html的所有path

通过你的需要将是类似的东西

 location /service/ { rewrite ^\/service\/(.*) /$1 break; proxy_pass http://apache; } 

如果你想最终在http://127.0.0.1:8080/query/params/

如果你想最终在http://127.0.0.1:8080/service/query/params/你需要像;

 location /service/ { rewrite ^\/(.*) /$1 break; proxy_pass http://apache; } 
 set $token "?"; # init token is "?" for original request without args if ($is_args) { # if the request has args update token to "&" set $token "&"; } location /test { set $args "${args}${token}k1=v1&k2=v2"; # update original append custom params with $token # if no args $is_args is empty str,else it's "?" # http is scheme # service is upstream server proxy_pass http://service/$uri$is_args$args; # proxy pass } #http://localhost/test?foo=bar ==> http://service/test?foo=bar&k1=v1&k2=v2 #http://localhost/test/ ==> http://service/test?k1=v1&k2=v2 

要redirect不查询string,请在侦听端口行下面的服务器块中添加以下行

if ($uri ~ .*.containingString$) { return 301 https://$host/$uri/; }

使用查询string

if ($uri ~ .*.containingString$) { return 301 https://$host/$uri/?$query_string; }