阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Nginx Location和Rewrite深入剖析

260次阅读
没有评论

共计 4441 个字符,预计需要花费 12 分钟才能阅读完成。

Nginx Location

Nginx 由内核和模块组成,其中内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端的请求映射到一个 location block,而 location 是 Nginx 配置中的一个指令,用于访问的 URL 匹配,而在这个 location 中所配置的每个指令将会启动不同的模块去完成相应的工作。

  • location 功能是由 ngx_http_index_module 模块提供的。
  • location 常放在 server 上下文。
  • location 匹配与 location 的放置顺序无关,而是与 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 规则重写的用途:

  • 对搜索引擎优化(Search Engine Optimization,SEO)友好,利于搜索引擎抓取网站页面;
  • 隐藏网站 URL 真实地址,浏览器显示更加美观;
  • 网站变更升级,可以基于 Rewrite 临时重定向到其他页面。
  • Nginx Rewrite 是由 ngx_http_rewrite_module 模块提供;
  • Nginx Rewrite 可以使用正则替换 URL,返回重定向页面。
  • Nginx Rewrite 是按顺序进行匹配的。
  • Nginx Rewrite 放在 server,location,if 上下文。

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;

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计4441字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中