Nginx服务重写功能
一、重写功能
1.什么是重写功能
Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求,此功能依靠 PCRE(perl compatible regular expression),因此编译之前要安装PCRE库,rewrite是nginx服务器的重要功能之一。
2.重写功能作用
重写功能(rewrite)用于实现URL的重写,URL的重写是非常有用的功能,比如它可以在我们改变网站结构之后,不需要客户端修改原来的书签,也无需其他网站修改我们的链接,就可以设置为访问,另外还可以在一定程度上提高网站的安全性。
3.rewrite 指令
3.1 if指令
用于条件匹配判断,并根据条件判断结果选择不同的Nginx配置,可以配置在server或location块中进行配置,Nginx的if语法仅能使用if做单次判断,不支持使用if else或者if elif这样的多重判断,用法如下:
if (条件匹配) { action }
使用正则表达式对变量进行匹配,匹配成功时if指令认为条件为true,否则认为false,变量与表达式之间使用以下符号链接:
= #比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false
!= #比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false
~ #区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~ #区分大小写字符,判断是否匹配,不满足匹配条件为真,满足匹配条件为假
~* #不区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~* #不区分大小字符,判断是否匹配,满足匹配条件为假,不满足匹配条件为真
-f 和 !-f #判断请求的文件是否存在和是否不存在
-d 和 !-d #判断请求的目录是否存在和是否不存在
-x 和 !-x #判断文件是否可执行和是否不可执行
-e 和 !-e #判断请求的文件或目录是否存在和是否不存在(包括文件,目录,软链接)
#注意:
#如果$变量的值为空字符串或0,则if指令认为该条件为false,其他条件为true。
#nginx 1.0.1之前$变量的值如果以0开头的任意字符串会返回false
#示例:http://www.baidu.com
3字打头重定向
301 永久重定向 将缓存记录在浏览器中
302 临时重定向 没有缓存 每次都要重定向
304
范例:
1 location /main { 2 index index.html; 3 default_type text/html; 4 if ( $scheme = http ){ 5 echo "if-----> $scheme"; 6 } 7 if ( $scheme = https ){ 8 echo "if ----> $scheme"; 9 } 10 11 #if (-f $request_filename) { 12 # echo "$request_filename is exist"; 13 #} 14 if (!-e $request_filename) { 15 echo "$request_filename is not exist"; 16 #return ; 17 } 18 }
3.2 return指令
return用于完成对请求的处理,并直接向客户端返回响应状态码,比如:可以指定重定向URL(对于特殊重定向状态码,301/302等) 或者是指定提示文本内容(对于特殊状态码403/500等),处于此指令后的所有配置都将不被执行,return可以在server、if 和 location块进行配置
语法格式:
1 www.kgc.com/test/ 2 404 3 return code; #返回给客户端指定的HTTP状态码 4 return code [text]; #返回给客户端的状态码及响应报文的实体内容,可以调用变量,其中text如果有空格,需要用单或双引号 5 return code url; #返回给客户端的URL地址
范例:
1 location / { 2 root /data/nginx/html/pc; 3 default_type text/html; 4 index index.html; 5 if ( $scheme = http ){ 6 #return 666; 7 #return 666 "not allow http"; 8 #return 301 http://www.baidu.com; 9 return 500 "service error"; 10 echo "if-----> $scheme"; #return后面的将不再执行 11 } 12 if ( $scheme = https ){ 13 echo "if ----> $scheme"; 14 } 15 } 16 17 例子1: 18 server { 19 listen 80; 20 server_name www.kgc.com; 21 root /data/nginx/pc/; 22 location /{ 23 root /data/nginx/pc/; 24 25 } 26 location /test { #访问test 直接返回403 27 return 403; #可以改成666 28 } 29 30 } 31 32 例子2: 33 location /test { #访问test 直接返回403 34 return 666 "hello"; #可以改成666自定义,hello是描述 文字可以 图形浏览器不可以 35 } 36 37 38 例子3: 39 location /test { 40 default_type text/plain; #定义文本格式后图形浏览器可以看见 41 return 666 "hello"; 42 } 43 44 45 例子4: 46 location /test { 47 default_type text/plain; 48 return 302 http://www.baidu.com; 49 } 50 51 301 缓存在磁盘上,有些 52 302 没有缓存 , 服务器断开无法重定向 jd
永久重定向
3.3 set指令
指定key并给其定义一个变量,变量可以调用Nginx内置变量赋值给key,另外set定义格式为set $key value,value可以是text, variables和两者的组合。
范例:
1 location /main { 2 root /data/nginx/html/pc; 3 index index.html; 4 default_type text/html; 5 set $name kgc; 6 echo $name; 7 set $my_port $server_port; 8 echo $my_port; 9 }
3.4 break指令
注意: 如果break指令在location块中后续指令还会继续执行,只是不执行 ngx_http_rewrite_module 模块的指令,其它指令还会执行
语法如下:
1 if ($slow) { 2 limit_rate 10k; 3 break; 4 } 5 location /main { 6 root /data/nginx/html/pc; 7 index index.html; 8 default_type text/html; 9 set $name kgc; 10 echo $name; 11 break; #location块中break后面指令还会执行 12 set $my_port $server_port; 13 echo $my_port; 14 }
3.5 rewrite指令
通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配,rewrite主要是针对用户请求的URL或者是URI做具体处理。
rewrite可以配置在 server、location、if
语法格式 :
1 rewrite可以配置在 server、location、if 2 语法格式 : 3 rewrite regex replacement [flag]; 4 正则匹配原始访问url 替代你想让客户访问的 标志
注意:如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查,隐含有循环机制,但不超过10次;如果超过,提示500响应码,[flag]所表示的标志位用于控制此循环机制如果替换后的URL是以http://或https://开头,则替换结果会直接以重定向返回给客户端, 即永久重定向 301
正则表达式格式
1 . #匹配除换行符以外的任意字符 2 \w #匹配字母或数字或下划线或汉字 3 \s #匹配任意的空白符 4 \d #匹配数字 5 \b #匹配单词的开始或结束 6 ^ #匹配字付串的开始 7 $ #匹配字符串的结束 8 * #匹配重复零次或更多次 9 + #匹配重复一次或更多次 10 ? #匹配重复零次或一次 11 (n) #匹配重复n次 12 {n,} #匹配重复n次或更多次 13 {n,m} #匹配重复n到m次 14 *? #匹配重复任意次,但尽可能少重复 15 +? #匹配重复1次或更多次,但尽可能少重复 16 ?? #匹配重复0次或1次,但尽可能少重复 17 {n,m}? #匹配重复n到m次,但尽可能少重复 18 {n,}? #匹配重复n次以上,但尽可能少重复 19 \W #匹配任意不是字母,数字,下划线,汉字的字符 20 \S #匹配任意不是空白符的字符 21 \D #匹配任意非数字的字符 22 \B #匹配不是单词开头或结束的位置 23 [^x] #匹配除了x以外的任意字符 24 [^kgc] #匹配除了kgc 这几个字母以外的任意字符
4. rewrite标志
4.1 redirect标志
redirect 等于302即临时重定向,不会在浏览器中缓存。
4.2 permanent标志
permanent 等于301即永久重定向,会在浏览器中缓存。
4.3 break标志
break标志会重定向,但是不会显示跳转后的域名,只显示用户输入的域名。
4.4 last标志
last标志,重写完成后,停止对当前URI在当前location中后续的其它重写操作,而后对新的URL启动新一轮重写检查,不建议在location中使用。
5. rewrite标志实验
首先在主配置文件中创建2个虚拟主机,www.bj.com和www.beijing.com并且使用rewrite指令使得访问www.bj.com时跳转到www.beijing.com。
1 redirect、permanent实例,访问www.bj.com跳转到www.beijing.com 2 配置文件中添加: 3 server { 4 listen 80; 5 #监听80端口 6 server_name www.bj.com; 7 #虚拟主机www.bj.com 8 root /data/nginx/bj; 9 #虚拟主机1根目录 10 location / { 11 root /data/nginx/bj; 12 #虚拟主机1根目录 13 rewrite / http://www.beijing.com permanent; 14 #访问虚拟主机1 www.bj.com时使用rewrite永久重定向到www.beijing.com。注意此处协议写全 15 } 16 17 } 18 server { 19 listen 80; 20 #监听80端口 21 server_name www.beijing.com; 22 #虚拟主机2 www.beijing.com 23 root /data/nginx/beijing; 24 #虚拟主机2根目录 25 } 26 nging -t 27 #检查配置文件是否有错误 28 nginx -s reload 29 #热加载nginx配置文件
然后创建虚拟主机1和虚拟主机2的根目录并在虚拟主机1即www.bj.com的index.html中写入内容“this is bj”在虚拟主机2的根目录即www.beijing.com的index.html中写入内容“this is bj jump beijing”
1 mkdir -p /data/nginx/bj 2 #创建www.bj.com的根目录 3 mkdir -p /data/nginx/beijing 4 #创建www.beijing.com的根目录 5 echo "this is bj">/data/nginx/bj/index.html 6 #将this is bj 写入www.bj.com的根目录文件index.html中 7 echo "this is bj jump beijing">/data/nginx/beijing/index.html 8 #将this is bj jump beijing 写入www.beijing.com的根目录文件index.html中
使用另外一台机器在/etc/hosts中添加本机ip对应www.bj.com和www.beijing.com。然后使用curl访问查看是否为302永久重定向提示,然后使用curl 域名 -L,查看跳转后的网页内容。
1 vim /etc/hosts 2 #编辑hosts文件 3 #添加内容: 4 192.168.30.11 www.bj.com www.beijing.com 5 #此处ip为自己ip
redirect临时重定向和break使用只需要将配置文件中的permanent改为对应标志即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具