Nginx 配置反向代理

1. location的配置

语法规则

location [=|~|~*|^~] /uri/ { … }

  • ~ 为区分大小写匹配(可用正则表达式)

  • !~ 为区分大小写不匹配

  • ~* 为不区分大小写匹配(可用正则表达式)

  • !~* 为不区分大小写不匹配

  • ^~ 开头表示uri以某个常规字符串开头,Nginx将在这个字符串匹配后停止进行正则表达式的匹配(location指令中正则表达式的匹配的结果优先使用),如:location ^~/images/,你希望对/images/这个目录进行一些特别的操作,如增加expires头,防盗链等,但是你又想把除了这个目录的图片外的所有图片只进行增加expires头的操作,这个操作可能会用到另外一个location,例如:location ~*\.(gif|jpg|jpeg)$,这样,如果有请求/images/1.jpg,Nginx如何决定去进行哪个location中的操作呢?结果取决于标识符^~,如果你这样写:location /images/,这样Nginx会将1.jpg匹配到location ~*\.(gif|jpg|jpeg)$这个location中,这并不是你需要的结果,而增加了^~这个标识符后,它在匹配了/images/这个字符串后就停止搜索其它带正则的location。Nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。

  • = 表示精确的查找地址,如location=/它只会匹配uri为/的请求,如果请求为/index.html,将查找另外的location,而不会匹配这个,当然可以写两个location,location = /location /,这样/index.html将匹配到后者,如果你的站点对/的请求量较大,可以使用这个方法来加快请求的响应速度。

  • @ 表示为一个location进行命名,即自定义一个location,这个location不能被外界所访问,只能用于Nginx产生的子请求,主要为error_page和try_files。

优先级顺序

(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (/)

示例
location = / {

# 只匹配 / 查询。

}


location / {

# 匹配任何查询,因为所有请求都已 / 开头。但是正则表达式规则和长的块规则将被优先和查询匹配。

}

location ^~ /images/ {

# 匹配任何已 /images/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试。

}

location ~*.(gif|jpg|jpeg)$ {

# 匹配任何已 gif、jpg 或 jpeg 结尾的请求。

}
复制代码

2. Rewrite

location ^~/proxy/html/{

    rewrite ^/proxy/html/(.*)$ /$1 break;

    proxy_pass http://www.b.com/;

}
复制代码

以下做一个解释:

  1. ^~ /proxy/html/

  拦截请求,匹配任何以/proxy/html/开头的地址,匹配符合以后,停止往下搜索正则。

  1. rewrite ^/proxy/html/(.*)$ /$1 break;

  重写拦截进来的请求,并且只能对域名后边的除去传递的参数外的字符串起作用,例如传入www.c.com/proxy/html/api/msg?method=1&para=2,只对/proxy/html/api/msg重写。

  rewrite后面的参数是一个简单的正则 ^/proxy/html/(.*)$ ,$1代表正则中的第一个(),$2代表第二个()的值,以此类推。

  break代表匹配一个之后停止匹配。

  1. proxy_pass

既是把请求代理到其他主机,其中 http://www.b.com/ 写法和 http://www.b.com 写法的区别如下:

不带/

  location /html/
{
  proxy_pass http://b.com:8300;
}
复制代码

带/

  location /html/
{
  proxy_pass http://b.com:8300/;
}
复制代码

上面两种配置,区别只在于proxy_pass转发的路径后是否带 “/”。
针对情况1,如果访问url = http://server/html/test.jsp,则被nginx代理后,请求路径会变为http://proxy_pass/html/test.jsp,将test/ 作为根路径,请求test/路径下的资源。

针对情况2,如果访问url = http://server/html/test.jsp,则被nginx代理后,请求路径会变为http://proxy_pass/test.jsp,直接访问server的根资源。

修改配置后重启nginx代理就成功了。

3. 参考文档

[1] nginx配置location总结及rewrite规则写法

[2] 用nginx的反向代理机制解决前端跨域问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值