`

nginx的location和proxy_pass正则

阅读更多
location里的正测表达式,是怎么匹配到proxy_pass上的
比如
//配置A
location ~* /image/ {
              proxy_pass http://192.168.1.1/
}


//配置B
location ~* /image/ {
              proxy_pass http://192.168.1.1
}


配置A和B的区别在于一个/
需要注意的是
nginx里的正则表达式里,路径里的斜杠"/"是不需要转义的,
而pcretest命令里的正则是需要转义的,应该转义为"\/"的
/some/url/的正则表达式,在pcre里为 \/some\/url\/

Nginx配置proxy_pass转发的/路径问题
引用


在nginx中配置proxy_pass时,如果是按照^~匹配路径时,要注意proxy_pass后的url最后的/,当加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走。

location ^~ /static_js/
{
proxy_cache js_cache;
proxy_set_header Host js.test.com;
proxy_pass http://js.test.com/;
}

如上面的配置,如果请求的url是http://servername/static_js/test.html
会被代理成http://js.test.com/test.html

而如果这么配置

location ^~ /static_js/
{
proxy_cache js_cache;
proxy_set_header Host js.test.com;
proxy_pass http://js.test.com;
}

则会被代理到http://js.test.com/static_js/test.htm

当然,我们可以用如下的rewrite来实现/的功能

location ^~ /static_js/
{
proxy_cache js_cache;
proxy_set_header Host js.test.com;
rewrite /static_js/(.+)$ /$1 break;
proxy_pass http://js.test.com;
}




nginx的proxy_pass模块说明

引用

语法: proxy_pass URL;
默认值: —
上下文: location, if in location, limit_except

设置后端服务器的协议和地址,还可以设置可选的URI以定义本地路径和后端服务器的映射关系。 这条指令可以设置的协议是“http”或者“https”,而地址既可以使用域名或者IP地址加端口(可选)的形式来定义:

    proxy_pass http://localhost:8000/uri/;

又可以使用UNIX域套接字路径来定义。该路径接在“unix”字符串后面,两端由冒号所包围,比如:

    proxy_pass http://unix:/tmp/backend.socket:/uri/;

如果解析一个域名得到多个地址,所有的地址都会以轮转的方式被使用。当然,也可以使用服务器组来定义地址。

请求URI按下面规则传送给后端服务器:

    如果proxy_pass使用了URI,当传送请求到后端服务器时,规范化以后的请求路径与配置中的路径的匹配部分将被替换为指令中定义的URI:

        location /name/ {
            proxy_pass http://127.0.0.1/remote/;
        }

    如果proxy_pass没有使用URI,传送到后端服务器的请求URI一般客户端发起的原始URI,如果nginx改变了请求URI,则传送的URI是nginx改变以后完整的规范化URI:

        location /some/path/ {
            proxy_pass http://127.0.0.1;
        }

        在1.1.12版以前,如果proxy_pass没有使用URI,某些情况下,nginx改变URI以后,会错误地将原始URI而不是改变以后的URI发送到后端服务器。

某些情况下,无法确定请求URI中应该被替换的部分:

    使用正则表达式定义路径。

    这种情况下,指令不应该使用URI。
    在需要代理的路径中,使用rewrite指令改变了URI,但仍使用相同配置处理请求(break):

        location /name/ {
            rewrite    /name/([^/]+) /users?name=$1 break;
            proxy_pass http://127.0.0.1;
        }

    这种情况下,本指令设置的URI会被忽略,改变后的URI将被发送给后端服务器。

后端服务器的地址,端口和URI中都可以使用变量:

    proxy_pass http://$host$uri;

甚至像这样:

    proxy_pass $request;

这种情况下,后端服务器的地址将会在定义的服务器组中查找。如果查找不到,nginx使用resolver来查找该地址。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics