Nginx由内核和模块组成,其中内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端的请求映射到一个location block,而location是Nginx配置中的一个指令,用于访问的URL匹配,而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。
常见的location匹配的URL方式如下:
符号 | 解释 |
---|---|
= | 字面精确匹配,精确到文件 |
^~ | URL的前缀匹配,不支持正则 |
~ | 正则匹配检查,区分大小写 |
~* | 正则匹配检查,不区分大小写 |
/ | 不带任何前缀 |
location匹配优先级如下:
(location =) > (location 完整路径)> (location ^~) > (location ~) > (location ~*) > ( location部分起始路径) > (location / )
Nginx Location规则案例:
1.只会匹配/,优先级比location / 低,= file 匹配到file的优先级最高。
location =/ { [ configuration L1 ] }
2.直接匹配到到file,优先级最高。
location =/index.html { [ configuration L2 ] }
3.可以匹配任何请求,但是因为从 / 开始匹配,所有优先级最低。
location / { [ configuration L3 ] }
4.匹配任何以/p_w_picpaths/开始的请求,并且停止匹配其他的loation;
location = /p_w_picpaths/ { [ configuration L4 ] }
5.匹配以html、txt、gif、jpg、jpeg结尾的URL文件请求, 但是所有/p_w_picpaths/目录的请求将由 [Configuration L4]处理。
location ~* \.(html|txt|gif|jpg|jpeg)$ { [ configuration L5] }
浏览器发起HTTP Request URI案例与Location规则案例匹配如下:
/ -> 匹配configuration L3; /index.html 匹配configuration L2; /p_w_picpaths/ 匹配configuration L4; /p_w_picpaths/logo.png 匹配configuration L4; /img/test.jpg 匹配configuration L5。
生产环境中无需在Nginx.conf配置文件中同时添加五种规则匹配,如下为企业生产环境Nginx Location部分配置代码:
#匹配/,优先级最低 location / { root /var/www/html/; expires 60d; } #匹配静态页面,由本地解析 location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ { root /var/www/html/; expires 60d; } #匹配动态页面,交给后端服务器 location ~ .*\.(jsp|php|cgi|do)$ { root /var/www/html/; proxy_pass http://linux_web; proxy_http_version 1.1; proxy_set_header Connection ""; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } #直接匹配newindex.html,优先级最高 location =/newindex.html { root /var/www/newwww/; expires 60d; }
Nginx Rewrite
Rewirte规则也称为规则重写,主要功能是实现浏览器访问HTTP URL的跳转,其正则表达式是基于Perl语言。通常而言,几乎所有的WEB服务器均可以支持URL重写。
Rewrite URL规则重写的用途:
Nginx Rewrite规则使用中有三个概念需要理解,分别是:Rewrite结尾标识符、Rewrite规则常用表达式、Nginx Rewrite变量,如下为三个概念的详解:
Rewrite结尾标识符:由于Rewrite规则末尾,表示规则的执行属性。
1.last :相当于Apache里的(L)标记,表示完成rewrite匹配,匹配完成后还会向下继续匹配。
2.break:本条规则匹配完成后,终止匹配,不再匹配后面的规则.
3.redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址。
4.permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。
其中last和break用来实现URL重写时,浏览器地址栏URL地址不变。
Rewrite规则常用表达式:要用于匹配参数、字符串及过滤设置。
符号 | 意义 |
---|---|
. | 匹配任何单个字符 |
[word] | 匹配字符串word |
[^word] | 不匹配字符串word |
aa|bb | 可选择字符串aa|bb |
? | 匹配0到1个字符 |
* | 匹配0到多个字符 |
+ | 匹配1到多个字符 |
^ | 字符串开始标志 |
$ | 字符串结尾标志 |
\n | 转义字符 |
Rewrite变量:常用于匹配HTTP请求头信息、浏览器主机名、URL等。
HTTP headers:HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_HOST, HTTP_ACCEPT; connection & request: REMOTE_ADDR, QUERY_STRING; server internals: DOCUMENT_ROOT, SERVER_PORT, SERVER_PROTOCOL; system stuff: TIME_YEAR, TIME_MON, TIME_DAY。
详解如下: HTTP_USER_AGENT 用户使用的代理,例如浏览器; HTTP_REFERER 告知服务器,从哪个页面来访问的; HTTP_COOKIE 客户端缓存,主要用于存储用户名和密码等信息; HTTP_HOST 匹配服务器ServerName域名; HTTP_ACCEPT 客户端的浏览器支持的MIME类型; REMOTE_ADDR 客户端的IP地址 QUERY_STRING URL中访问的字符串; DOCUMENT_ROOT 服务器发布目录; SERVER_PORT 服务器端口; SERVER_PROTOCOL 服务器端协议; TIME_YEAR 年; TIME_MON 月; TIME_DAY 日;
补充: if指令:
语法: if (condition) { ... } 默认值: — 上下文: server, location
计算指定condition的值。计算指定的condition的值。如果为真,执行定义在大括号中的rewrite模块指令,并将if指令中的配置指定给请求。if指令会从上一层配置中继承配置。
condition为下:
条件 | 解释 |
---|---|
变量名 | 如何变量值为空或者以0开始的字符串,则为假 |
= | 运算符等于,则为真 |
!= | 运算符不等于,则为真 |
~ | 大小写敏感,匹配变量和正则 |
~* | 大小写不敏感,匹配变量和正则 |
-f | !-f | 检查文件是否存在 |
-d | !-d | 检查目录是否存在 |
-e | !-e | 检查文件,目录或符号链接是否存在 |
-x | !-x | 检查是否是可执行文件 |
Nginx Rewrite案例
1.将www.abc1.com 跳转到 www.abc2.com
if ( $host = 'www.abc1.com' ){ rewrite ^/(.*)$ http://www.abc2.com/$1 permanent; }
2.访问www.abc1.com跳转www.abc1.com/newindex.html
rewrite ^/$ http://www.abc1.com/newindex.html permanent;
3.访问/test/跳转到www.abc1.com/newindex.html
rewrite ^/test/$ http://www.abc1.com/newindex.html permanent;
4.多域名跳转到 www.abc1.com
if ( $host != 'www.abc1.com' ) { rewrite ^/(.*)$ http://www.abc1.com/$1 permanent; }
5.访问文件和目录不存在跳转至index.html。
if ( !-e $request_filename ) { rewrite ^/(.*)$ /index.html last; }
6.目录对换 /xxxx/123456 ====> /xxxx?id=123456
rewrite ^/(.+)/(\d+) /$1?id=$2 last;
7.判断浏览器User Agent跳转。
if( $http_user_agent ~ MSIE) { rewrite ^(.*)$ /ie/$1 break; }
8.禁止访问以.sh,.flv,.mp3为文件后缀名的文件。
location ~ .*\.(sh|flv|mp3)$ { return 403; }
9.将移动用户访问跳转至移动端。
if ( $http_user_agent ~* "(Android)|(iPhone)|(Mobile)|(WAP)|(UCWEB)" ) { rewrite ^/$ http://m.linuxidc.net/ permanent; }
10.匹配URL访任意字符串后面含有?tid=13就跳转,$args 表示任意字符串
if ( $args ~* tid=13 ){ return 404; }
11.访问/10690/jj/123跳转至/index.php?tid/10690/items=123,[0-9]表示任意一个数字,+表示多个,(.+)表示任何多个字符。
rewrite ^/([0-9]+)/jj/(.+)$ /index.php?tid/$1/items=$2 permanent;
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有