如何查询字符串参数通过nginx的一个proxy_pass被转发?如何查询字符串参数通过nginx的

2019-05-13 10:13发布

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

上面的代码片段将重定向其中的URL包含字符串“服务”到另一台服务器的请求,但它不包括查询参数。

Answer 1:

从proxy_pass文档:

一种特殊的情况是在proxy_pass语句中使用的变量:不使用请求的URL,你是全权负责自己构建的目标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/;
}

或者,如果你想使用正则表达式的位置,就包括ARGS:

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


Answer 2:

我用的kolbyjack的第二种方法稍加修改的版本~代替~*

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


Answer 3:

我修改@kolbyjack代码,使之成为工作

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

与参数

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


Answer 4:

您必须使用重写通过使用proxy_pass PARAMS我这里是我做了angularjs应用程序部署到S3

S3静态虚拟主机路由所有路径的Index.html

通过您的需求将是这样的

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;
}


Answer 5:

GitHub的要点https://gist.github.com/anjia0532/da4a17f848468de5a374c860b17607e7

#set $token "?"; # deprecated

set $token ""; # declar token is ""(empty str) for original request without args,because $is_args concat any var will be `?`

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; # deprecated remove `/`
    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


Answer 6:

为了不查询字符串添加重定向以下服务器块线下监听端口线:

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

查询字符串:

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


文章来源: How can query string parameters be forwarded through a proxy_pass with nginx?