Answers:
从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;
}
location /service/ { rewrite ^\/service\/(.*) /$1 break; proxy_pass http://apache; }
我使用的是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
上面的指令在服务器端执行重定向。
您必须使用重写以使用proxy_pass传递参数,这是我将angularjs应用部署到s3的示例
适应您的需求将类似于
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;
}
/path/params
),但不能很好地处理查询参数(?query=params
)?
github gist 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
要在没有查询字符串的情况下进行重定向,请在侦听端口行下的服务器块中添加以下行:
if ($uri ~ .*.containingString$) {
return 301 https://$host/$uri/;
}
使用查询字符串:
if ($uri ~ .*.containingString$) {
return 301 https://$host/$uri/?$query_string;
}
if
在可能的情况下使用。在这种情况下,使用location
其他答案所示的解决方案可能是正确的。
与添加$ request_uri proxy_pass http:// apache / $ request_uri一起工作;