nginx的location和proxy_pass正则
- 博客分类:
- linux
location里的正测表达式,是怎么匹配到proxy_pass上的
比如
配置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来查找该地址。
比如
//配置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来查找该地址。
发表评论
-
linux 安装mysql多个实例
2020-03-13 15:47 358mysql5.7.28多实例 安装mysql,不要启动 创 ... -
批量替换配置文件中的URL
2020-03-11 13:35 292find -iregex ".*/sh[a-z ... -
rsync备份和删除指定文件
2018-01-02 10:23 1963文件异地备份时,需要将本地文件合并到服务器上,且不能删除服务器 ... -
linux 定时任务crontab操作
2017-12-28 16:14 580常用参数: crontab -l //查看当前用户下 ... -
iptables 日志
2017-11-15 15:06 1305centos6.5配置了iptables的nat功能,但是不知 ... -
linux删除乱码文件
2017-09-30 11:20 632系统里好多乱码文件,删除不了 这个办法挺好 [url=htt ... -
解决vsftpd中文乱码问题
2017-08-25 10:45 0vsftpd中文乱码,通过ftp工具上传的中文文件会变为乱码J ... -
LVM常用命令
2017-08-25 10:28 531lvm 查看命令 lvs vgs pvs vgdisplay ... -
Centos7 firewalld操作
2017-08-25 10:27 540启动:# systemctl start firewall ... -
centos 添加DNAT SNAT
2017-08-25 10:19 3320外网服务器IP 101.168.200.22 开放端口8310 ... -
centos6.5 配置PXE系统
2017-08-25 09:58 682参考https://linux.cn/article-4902 ... -
centos6 tomcat 启动脚本 tomcat服务
2017-08-23 11:24 1363系统自动启动tomcat 复制该脚本到/etc/init.d/ ... -
CentOS6.5 整机备份与迁移恢复 五
2017-07-10 14:44 794修改网卡等配置 B服务器启动后,由于权限等原因会导至部分功能出 ... -
CentOS6.5 整机备份与迁移恢复 四
2017-07-07 16:52 800修改B系统引导器,正常启动B系统 选择系统安装或更新 ... -
CentOS6.5 整机备份与迁移恢复 三
2017-07-07 16:41 981恢复系统文件 使用光盘启动B服务器,进入rescue模式,进入 ... -
CentOS6.5 整机备份与迁移恢复 二
2017-07-07 16:05 1075恢复分区表和格式化分区 在B服务器上,使用同样的系统盘启动系统 ... -
CentOS6.5 整机备份与迁移恢复 一
2017-07-07 15:32 7478CentOS6.5的整机备份与迁 ... -
centos vsftpd 虚拟用户安装配置
2017-07-07 14:11 592安装vsftpd yum install -y vsftp ... -
openstack 虚拟机改IP
2017-03-31 17:17 1621虚拟环境搭建好以后,需要把实体服务器切换到虚拟机中,为了 ... -
编译安装openstack mitaka horizon
2017-03-15 15:19 1571由于openstack的rpm包 ...
相关推荐
nginx_tcp_proxy_module-master.zip
nginx正则表达式. : 匹配除换行符以外的任意字符? : 重复0次或1次+ : 重复1次或更多次* : 重复0次或更多次\d :匹配数字^ : 匹配字符串的开始$ : 匹配字符串的介绍{n} : 重复n次{n} : 重复n次或更多次[c] :...
格式很简单: proxy_pass URL; 其中URL包含:传输协议(http://, https://等)、主机名(域名或者IP:PORT)、uri。 示例如下: proxy_pass http://www.xxx.com/; proxy_pass http://192.168.200.101:8080/uri; ...
所以在这里用到了nginx的proxy_redirect指定修改被代理服务器返回的响应头中的location头域跟refresh头域数值 以下是截取nginx的一小段配置文档 server { listen 80; server_name www.boke.com; l
1、准备两个tomcat和一个nginx 1.1、tomcat: http://127.0.0.1:8080 1.2、tomcat:http://127.0.0.1:8081 1.3、nginx:http://127.0.0.1 2、反向代理proxy_pass 2.1、反向代理 2.2、反向代理-使用upstream 2.3、反向...
一个nginx的server模块下需要proxy到两个server,所以就通过location的不同路径来区分转发到不同的服务器上。 一开始是这么写的 location / { proxy_pass http://server1/; } location /index { proxy_pass ...
1、首先我们回顾一下nginx中location的相关知识 1)location的匹配指令: ~ #波浪线表示执行一个正则匹配,区分大小写 ~* #表示执行一个正则匹配,不区分大小写 ^~ #^~表示普通字符匹配,不是正则匹配。如果该...
nginx中location中关于proxy_pass和rewrite的应用.rar
最近排查一个web服务的问题,webserver使用的nginx,最终发现是踩了nginx中proxy_pass的一个坑,这里记录下来。 踩坑经过 一个线上的http服务,示例nginx关键配置如下: server { listen 80; server_name ligang....
nginx_tcp_proxy_module-master 是nginx的TCP模块
前言日常不管是研发还是运维,都多少会使用Nginx服务,很多情况Nginx用于反向代理,那就离不开使用proxy_pass,有些同学会对 proxy_pass
NULL 博文链接:https://phl.iteye.com/blog/2247856
备用nginx代理模块
使用nginx作为http/https正向代理ipm包,包含ngx_http_proxy_connect_module 模块,附带了第三方图片代理配置,带有缓存,可直接做图片服务器 下载后执行:rpm -ivh nginx-1.12.2-1.el7_4.ngx.x86_64.rpm 打包教程:...
在nginx中配置proxy_pass时,如果是按照^~匹配路径时,要注意proxy_pass后的url最后的/。当加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走。...
而在日常的web网站部署中,经常会用到nginx的proxy_pass反向代理,有一个配置需要弄清楚:配置proxy_pass时,当在后面的url加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,...
nginx: [emerg] “proxy_cache_path” directive is not allowed here in /etc/nginx/conf.d/default.conf:29 提示意思“proxy_cache_path指令不被允许”,在官网上查找了相关说明,也没有发现问题,最后看应用范围...