upstream apache {
server 127.0.0.1:8080;
}
server{
location ~* ^/service/(.*)$ {
proxy_pass http://apache/$1;
proxy_redirect off;
}
}
上面的代码片段将重定向其中的URL包含字符串“服务”到另一台服务器的请求,但它不包括查询参数。
upstream apache {
server 127.0.0.1:8080;
}
server{
location ~* ^/service/(.*)$ {
proxy_pass http://apache/$1;
proxy_redirect off;
}
}
上面的代码片段将重定向其中的URL包含字符串“服务”到另一台服务器的请求,但它不包括查询参数。
从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;
}
我用的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 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;
}
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
为了不查询字符串添加重定向以下服务器块线下监听端口线:
if ($uri ~ .*.containingString$) {
return 301 https://$host/$uri/;
}
查询字符串:
if ($uri ~ .*.containingString$) {
return 301 https://$host/$uri/?$query_string;
}