智能 助手
nginx location匹配及rewrite规则
nginx location匹配及rewrite规则
location匹配规则
1. 实例
| 1 | server{ | 
2. location语法规则
语法:
| 1 | location = | ~ | ~* | ^~ | @ /url/{ //注意 =、~、~*、^~ 、@是location的匹配规则,”|“表示或者 | 
规则说明:
| 符号 | 含义 | 
|---|---|
| = | 字面精准匹配,如果匹配,则跳出匹配过程(不再进行正则匹配) | 
| ~ | 开头区分大小写的正则匹配 | 
| ~* | 开头不区分大小写的正则匹配 | 
| ^~ | 开头表示uri以某哥常规字符串开头,理解为匹配url路径即可 | 
| / | 通用匹配,在没有正则表达式匹配时,任何请求都会匹配到 | 
| @ | 不是普通的location匹配,用于location内部重定向的变量 | 
| ~ | 开头区分大小写的正则匹配 | 
多个location配置的匹配顺序:
- 首先匹配:”=”
- 其次匹配:”^~”
- 再匹配:文件location书写顺序
- 最后把所有请求交给通配符(”/“)
注意:每次匹配成功后,停止匹配,会按照本匹配的location处理请求
按照上面实例进行说明匹配顺序:
- 首先对比第一个location,如果匹配就会停止匹配,并按照配置A进行处理请求:1 
 2
 3location = \ { 
 [配置A]
 }
- 其次对比第二个location,如果匹配就会停止匹配,并按照配置D进行处理请求:1 
 2
 3location ^~ /static/{ 
 [配置D]
 }
- 再按照顺序依此进行对比,直到找到匹配的才会停止,并按照所匹配的配置*进行处理请求
- 如果以上无任何匹配项则会选择通用选项,并按照所匹配的配置B进行处理请求:1 
 2
 3location / { 
 [配置B]
 }
3. 应用举例
- 精准规则(=)此规则表示只匹配以默认地址进行访问的请求,访问地址:http://NginxIP/1 
 2
 3location = / { 
 root /var/ww/html/;
 }
- 匹配url路径(^~)此规则表示只匹配以” /static/ “开头的地址进行访问的请求,访问地址:http://NginxIP/static/1 
 2
 3location ^~ /static/ { 
 root /var/www/html/static;
 }
- 忽略大小写(~*)此规则表示只匹配” *.png | *.gif | *.jpg “的文件,访问地址:http://NginxIP/test.png1 
 2
 3location ~* \.(png|gif|jpg){ 
 root /var/www/html/;
 }此规则表示匹配url地址中存在Test的访问请求,不区分大小写test也可以,访问地址:http://NginxIP/test/1 
 2
 3location ~* /Test/ { 
 root /var/www/html/;
 }
- 区分大小写(~)此规则表示匹配url地址中存在Test的访问请求,区分大小写,test是进行匹配的,访问地址:http://NginxIP/Test/1 
 2
 3location ~ /Test/{ 
 root /var/www/html/;
 }
- 默认匹配(所有规则都可匹配)此规则为默认匹配,他可以匹配所有以默认地址访问的链接,访问地址:http://NginxIP/login.html1 
 2
 3location / { 
 root /var/www/html;
 }
- 内部跳转(@)此规则表示匹配以 “/index/ “开头的请求,如果链接状态404,会匹配到这条规则1 
 2
 3location @index_error{ 
 root /var/www/error/
 }
rewrite规则详解
nginx的rewrite功能和apache一样,rewrite的主要功能是实现RUL地址的重定向。Nginx的rewrite功能是由PCRE软件支持,rewrite模块即ngx_http_rewrite_module模块。从某种意义上可以说为了美观或者搜索引起的友好搜索,提高排名等
1.实例
| 1 | server{ | 
2.rewrite语法规则
语法:
| 1 | rewrite regex replacement [flag] | 
rewrite:rewrite重写的关键字不可省略
regex:这里写的是正则表达式
replacement:这里是重新内容
flag:这里是最后的flag标记
flag标记说明:
| flag标记 | 说明 | 
|---|---|
| last | 也就是apache里的(L)标记,表示完成rewrite,URL地址不会改变 | 
| break | 本条规则匹配成功后,会停止匹配,不再匹配后面的规则,URL地址不会改变 | 
| redirect | 返回302临时重定向,浏览器地址会显示跳转后的URL地址 | 
| permanent | 返回301永久重定向,浏览器地址栏显示跳转后的URL地址,Nginx返回response状态码301 | 
| 相关符号说明: | 
| 符号 | 说明 | 
|---|---|
| * | 代表前面0或者多个字符 | 
| + | 代表前面1或者多个字符 | 
| ? | 代表前面0或1个字符 | 
| ^ | 代表字符串的开始位置 | 
| $ | 代表字符串结束位置 | 
| $n | 代表字符串结束第n个参数 | 
| . | 通配符,代表任何字符 | 
3.应用实例
- 多域名跳转到同一域名1 
 2
 3
 4
 5
 6
 7server{ 
 listen 80;
 server_name www.jkyst.xyz jkyst.xyz abc.jkyst.xyz;
 if($host != 'www.jkyst.xyz'){
 rewrite ^/(.*)$ http://www,jkyst.xyz/$1 permanent;
 }
 }
当访问 abc.jkyst.xyz 时会自动跳转到 www.jkyst.xyz ,这里出现if语句用于判断,判断结果为true则执行语句内部的 rewrite重写
- 当文件不存在时重定向到指定文件1 
 2
 3
 4
 5
 6
 7server{ 
 listen 80;
 server_name www.jkyst.xyz;
 if(!-e $request_filename){
 rewrite ^/test/(.*)$ http://www.jkyst.xyz/test1/$1 permanent;
 }
 }
当访问 “test” 目录下的文件或目录不存在时,则跳转到 “test1”下面的此文件或者目录,跳转后会将URL进行转换
| 1 | server{ | 
表示当访问 “test” 目录下的文件或目录不存在时,则重定向到 “index.html”文件,跳转后URl不会进行转换
| 1 | server{ | 
目录切换,表示将原目录转换成其他目录,【0-9a-z】表示转换后目录名称
- 禁止访问.sh后缀的文件1 
 2
 3
 4
 5
 6server{ 
 ......其他配置
 location ~.*\.(sh)${
 return 405;
 }
 }
表示当访问 “*.sh”的文件就会返回405错误
- 匹配用户浏览器代理信息1 
 2
 3
 4
 5
 6
 7server{ 
 listen 80;
 server_name www.jkyst.xyz;
 if ( $http_user_agent ~* ("Android")|(iPhone)){
 rewrite ^/test/(.*)$ http://www.jkyst.xyz/test/$1 permanent;
 }
 }
表示当匹配到浏览代理为Android和iPhone时进行重定向 “test”目录下的文件,改变访问的地址
- 禁止htaccess1 
 2
 3
 4
 5server{ 
 location ~//.ht {
 deny all;
 }
 }
4.文件目录匹配
| 参数 | 介绍 | 
|---|---|
| -f | 判断文件是否存在 返回值true为存在 | 
| !-f | 判断文件是否存在 返回值false为不存在 | 
| -d | 判断目录是否存在 返回值true为存在 | 
| !-d | 判断目录是否存在 返回值true为不存在 | 
| -e | 判断文件或目录是否存在 返回值true为存在 | 
| !-e | 判断文件或目录是否存在 返回值true为不存在 | 
| -x | 判断文件是否可执行 返回值true为可执行 | 
| !-x | 判断文件是否可执行 返回值true为不可执行 | 
举例说明:
| 1 | server{ | 
判断文件或目录是否存在
 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 避凉闲庭!
