nginx的rewrite使用,网址自定义更改
Posted 丁CCCCC
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx的rewrite使用,网址自定义更改相关的知识,希望对你有一定的参考价值。
rewrite
一、概述
本文主要讲解 rewrite 与 location
1.1 区别
- rewrite 是在同一域名内更改获取资源的路径
- location 是对一类路径做控制访问或反向代理,还可以proxy_pass 到其他机器
二、常用的正则
nginx 多处使用正则表达式,这里先把正则的几个符号说明一下
符号 | 作用 |
---|---|
^ | 匹配输入字符串的起始位置 |
$ | 匹配输入字符串的结束位置 |
* | 匹配前面的字符零次或多次 |
+ | 匹配前面的字符一次或多次 |
? | 匹配前面的字符零次或一次 |
. | 匹配除“\\n”之外的任何单个字符 |
\\ | 将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用 |
\\d | 匹配纯数字 |
{n} | 重复 n 次 |
{n,} | 重复 n 次或更多次 |
{n,m} | 重复 n 到 m 次 |
[ ] | 定义匹配的字符范围 |
[c] | 匹配单个字符 c |
[a-z] | 匹配 a-z 小写字母的任意一个 |
[a-zA-Z0-9] | 匹配所有大小写字母或数字 |
( ) | 表达式的开始和结束位置 |
| | 或运算符 |
三、location
3.1 类型
- 精准匹配:location = / {}
- 正则匹配:location ~ / {}
- 一般匹配:location / {}
3.2 匹配规则
符号 | 作用 |
---|---|
= | 进行普通字符精确匹配,也就是完全匹配 |
^~ | 表示普通字符匹配,前缀匹配成功后,不再继续往下匹配 |
~ | 区分大小写的匹配 |
~* | 不区分大小写的匹配 |
!~ | 区分大小写的匹配取反 |
!~* | 不区分大小写的匹配取反 |
3.3 优先级
- 精确匹配 =:等级最高
- 前缀匹配 ^~:次于精确匹配
- 按文件中顺序的正则匹配 ~或~*:次于上两
- 不带任何修饰的前缀匹配:等级低
- / 通用匹配:等级最低,前面不符合最后才会匹配根
3.4 举列
location = / {}
=号表示精确匹配 /,匹配的这个项后面不能带有任何东西
比如 /data 、/ 、/abc,只能匹配 /
location / {}
去掉 = 号就是一般匹配,/data 、 / 、 /abc 都能被匹配到
但若后面是正则表达式会和最长字符串优先匹配(最长匹配)
location /abc/ {}
匹配任何以 /abc/ 开头的地址,匹配符合以后,会继续往下搜索其它 location
由于优先级,其它 location后面的正则表达式没有匹配到时,才会采用这一条
location /ABC/abc {}
匹配任何以 /ABC/abc 开头的地址,匹配符合以后,继续往下搜索其它 location
location ^~ /abc/ {}
^~表示匹配成功后,不在继续往下匹配
匹配任何以 /abc/ 开头的地址,匹配符合以后,停止往下搜索,直接使用这一条
location ~* .(gif|jpg|jpeg)$ {}
- ~* :不分大小写匹配
- \\:表示转义 . ,匹配 .gif 等结尾
匹配所有以 gif、jpg或jpeg 结尾的请求
然而,所有请求 /images/ 下的图片会被 location ^~ /images/ 处理,因为 ^~ 的优先级更高,所以到达不了这一条正则
location /ABC/abc {}
最长字符匹配到 /ABC/abc,优先级最低,继续往下搜索其它 location,会发现 ^~ 和 ~ 存在
location ~ /ABC/abc {}
~ 区分大小写
匹配以/ABC/abc 开头的,优先级次之,只有去掉 location ^~ /images/ 才会采用这一条
location /ABC/abc/111.html {}
匹配/ABC/abc/111.html 文件,如果和正则 ~ /ABC/abc/111.html 相比,正则优先级更高
3.5 优先级总结
(location =) :优先级最高
(location 完整路径)
(location ^~ 路径)
(location ,* 正则顺序)
(location 部分起始路径)
(location /):优先级最低
3.6 匹配规则定义
必选规则
直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。这里是直接转发给后端应用服务器了,也可以是一个静态首页
location = / {
proxy_pass http://tomcat_server/;
}
处理静态文件请求
有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {
root /webroot/static/;
}
location ~* \\.(html|gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}
通用规则
用来转发带.php、.jsp后缀的动态请求到后端应用服务器
非静态文件请求就默认是动态请求
location / {
proxy_pass http://tomcat_server;
}
三、rewrite
3.1 概述
使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向
rewrite只能放在server{},location{},if{}中,并且默认只能对域名后边的除去传递的参数外的字符串起作用
3.2 使用
-
rewrite 执行顺序如下
- 执行 server 块里面的 rewrite 指令
- 执行 location 匹配
- 执行选定的 location 中的 rewrite 指令
-
语法rewrite [flag];
- regex :表示正则匹配规则
- replacement :表示跳转后的内容
- flag :表示 rewrite 支持的 flag 标记
flag标记说明
- last
- 本条规则匹配完成后,继续向下匹配新的location URI规则,一般用在 server 和 if 中
- break
- 本条规则匹配完成即终止,不再匹配后面的任何规则,一般使用在 location 中
- redirect
- 返回302临时重定向,浏览器地址会显示跳转后的URL地址
- permanent
- 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
3.3 示例
基于域名的跳转
旧域名www.cc01.com变更使用新域名www.cc001.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变
进入主配置文件修改
- vim /usr/local/nginx/conf/nginx.conf
36 server {
37 listen 80;
38 server_name www.cc01.com; # 域名为旧域名
39 charset utf-8; # 万国符
40 access_log /var/www/html/cc01.com-access.log; # 日志目录
41 location / {
42 if ($host = 'www.cc01.com'){ # $host 全局变量,代表请求主机名
43 rewrite ^/(.*)$ http://www.cc001.com/$1 permanent; # $1 为正则匹配的内容,即域名后边的字符串
44 }
45 root html;
46 index index.html index.htm;
47 }
48 }
设置解析
- vim /etc/hosts
192.168.253.11 www.cc01.com www.cc001.com
访问
http://www.cc01.com/test/1.html
www.cc01.com为旧域名
/test/1.html 为网页内容
基于客户端IP访问的跳转
要求所有 IP 访问任何内容都显示一个固定维护页面,只有主 IP :192.168.253.11访问正常
修改主配置文件
- vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.cc01.com;
charset utf-8;
access_log /var/www/html/cc01.com-access.log;
# 设置是否合法的IP标记
set $rewrite true; # 设置变量,变量值为boole值true
# 判断是否合法
if ($remote_addr = "192.168.253.11"){ # 当客户端为253.11时,变量值为false,不进行重写
set $rewrite false;
}
# 除了合法的,其他都不合法,需要重写跳转维护页面
if ($rewrite = true){ # 变量值为true时重写
rewrite (.+) /weihu.html; # 重写在访问IP后面插入/weihu.html
}
location = /weihu.html { # 网页返回的是 /var/www/html目录里的weihu.html文件
root /var/www/html;
}
location / {
root html;
index index.html index.htm;
}
}
创建维护文件
- mkdir -p /var/www/html
- cat /var/www/html/weihu.html
- <h1>出去</h1>
- systemctl restart nginx
访问
基于旧域名跳转到新域名后面加目录
现在访问的是 http://bbs.cc01.com,需要将这个域名下面的访问都跳转到http://www.cc01.com/bbs
修改主配置文件
- vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name bbs.cc01.com; # 修改域名
charset utf-8;
access_log /var/www/html/cc01.com-access.log;
location /post {
rewrite (.+) http://www.cc01.com/bbs$1 permanent; # 这里$1代表/post
}
location / {
root html;
index index.html index.htm;
}
}
添加网页文件
- mkdir -p /usr/local/nginx/html/bbs/post
pwd
/usr/local/nginx/html/bbs/post
cat 1.html
<h1>bbs 1.html</h1>
加入解析
- vim /etc/hosts
192.168.253.11 bbs.cc01.com
- systemctl restart nginx
测试
基于参数匹配的跳转
访问http://www.cc01.com/100-(100|200)-100.html 跳转到http://www.cc01.com页面
修改主配置文件
- vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.cc01.com;
charset utf-8;
access_log /var/www/html/cc01.com-access.log;
if ($request_uri ~ ^/100-(100|200)-(\\d+).html$) { # 设置正则条件
rewrite (.*) http://www.cc01.com permanent;
}
location / {
root html;
index index.html index.htm;
}
}
测试
- systemctl restart nginx
http://www.cc01.com/100-200-100,html
http://www.cc01.com/100-150-100,html
基于目录下所有 php 结尾的文件跳转
要求访问 http://www.cc01.com/upload/1.php 跳转到首页
修改主配置文件
- vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.cc01.com;
charset utf-8;
access_log /var/www/html/cc01.com-access.log;
location ~* /upload/.*\\.php$ { # 正则公式
rewrite (.+) http://www.cc01.com permanent;
}
location / {
root html;
index index.html index.htm;
}
}
测试
http://www.cc01.com/upload/1.php
基于最普通一条 url 请求的跳转
访问一个具体的页面如 http://www.cc01.com/abc/123.html 跳转到首页
修改主配置文件
- vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.cc01.com;
charset utf-8;
access_log /var/www/html/cc01.com-access.log;
location ~* ^/abc/123.html {
rewrite (.+) http://www.cc01.com permanent;
}
location / {
root html;
index index.html index.htm;
}
}
测试
以上是关于nginx的rewrite使用,网址自定义更改的主要内容,如果未能解决你的问题,请参考以下文章