rewrite和localhost
Location:
对比location和rewrite
从功能上看rewrite 和 location 似乎优点像,都能实现跳转,主要区别在于 rewrite 是在同一个域名内更改获取资源的路径,而location 是对一类路径做控制访问或反向代理,还可以proxy_pass 到其他机器
location:用于匹配用户访问请求的URL,来使用哪一个目录中的网页资源
rewrite ... permanent:修改url后重定向再次请求访问
rewrite /weihu.html 按照修改域名后的url直接跳转到对应的location
rewrite 如果对全url重写,重写部分就要以http://...
如果不以http://... 开始重写,默认只对域名后传递参数前的部分重写
location 分为三大类:
- 精准匹配:location = / {...}
- 一般匹配:location / {...}
- 正则匹配:location ~ / {...}
location 常用的匹配规则:
=:进行普通字符精确匹配,也就是完全匹配
^~:表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他location
~:区分大小写的匹配
~*:不区分大小写的匹配
!~:区分大小写的匹配取非
!~*:不区分大小写的匹配取非
location优先级:
首先精确匹配 =
其次前缀匹配 ^~
其次是按文件中的顺序的正则匹配~或~*
然后匹配不带任何修饰的前缀匹配
最后交给/通用匹配
location示例说明:
(1)location = / {...}
=为精确匹配 / ,主机名后面不能到任何字符串,比如访问 / 和 /date , 则 / 匹配,/date 不匹配
再比如 location = /abc,则只匹配/abc,/abc/ 或 /abcd 不匹配 。若 location /abc , 则即匹配/abc 、/abcd/ 同时也匹配
(2)location / {...}
因为所有的地址都以 / 开头,所以这条规则匹配将匹配到所有的请求 比如访问 / 和 /date,则 / 匹配,/date 也匹配
但若后面是正则表达式会和最长字符串优先匹配(最长匹配)
(3)location /documents/ {}
匹配任何以/documents/开头的地址,匹配符合以后,还要继续往下搜索其他location
只有其他location后面的正则表达式没有匹配到时,才会采用这一条
(4)location /documents/abc {}
匹配任何以/documents/abc开头的地址,匹配符合以后,还要继续往下搜索其他location
只有其他location 后面的正则表达式没有匹配到时,才会采用这一条
(5)location ^~ /images/ {}
匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条
(6)location ~* \.(gif|jpg|jpeg)$ {}
匹配所有以gif 、jpg或jepg结尾的请求
然而,所有请求 .images/ 下的图片会被 location ^~ /images/ 处理,因为^~ 的优先级更高,所以到达不了这一条正则
(7)location /images/abc {}
最长字符匹配到/images/abc,优先级最低,继续往下搜索其他location,会发现^~ 和 ~ 存在
(8)location ~ /images/abc {}
匹配以/images/abc 开头的,优先级次之,只有去掉location ^~ /images/ 才会采用这一条
(9)location /images/abc/1.html {}
匹配/images/abc/1.html 文件,如果和正则location ~ /images/abc/1.html 相比,正则优先级更高
实际网站使用中,至少有三个匹配规则定义:
第一个必选规则:
直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网
可以是一个静态首页,也可以是直接转发给后端应用服务器

第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用


第三个规则就是通用规则
比如用来转发带.php、.jsp后缀的动态请求到后端应用服务器
非静态文件请求就默认是动态请求

rewrite:
rewrite的功能:
使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向。
比如:更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网页防盗链等等需求
rewrite只能放在server{},location{},if{}中,并且默认只能对域名后边的除去传递参数外的字符串起作用
例如:http://www.zyp.com/abc/bbs/index.php?a=1&b=2 只对/abc/bbs/index.php重写
rewrite跳转实现:
- Nginx:通过ngx_http_rewrite_module 模块支持URL重写、支持if条件判断,但不支持else
- 跳转:从一个location 跳转到另外一个location,循环最多可以执行10次,超过后nginx将返回500错误
- PCRE支持:perl兼容正则表达式的语法规则匹配
- 重写模块set 指令:创建新的变量并设其值
rewrite执行顺序如下:
- 执行server块里面的rewrite指令
- 执行location匹配
- 执行选定的location中的rewrite指令
语法格式:rewrite <regex> <replacement> [flag]
- regex:表示正则匹配规则
- replacement:表示跳转后的内容
- flag:表示rewrite支持的flag标记
flag标记说明:
- last:本条规则匹配完成后,继续向下匹配新的location URL规则,一般用在server 和 if 中
- break:本条规则匹配完成即终止,不再匹配后面的任何规则,一般使用在location中
- redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址
- permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
(1)rewrite基于域名的跳转



(2)基于客户端IP访问跳转




(3)基于旧域名跳转到新域名后面加目录


(4)基于参数匹配的跳转

(5)基于目录下所有php结尾的文件跳转

(6)基于最普通一条url请求的跳转

浙公网安备 33010602011771号