linux怎么查看本机内存大小
301
2022-10-12
Nginx中的Rewrite和location用法详解
rewrite定义
rewrite功能就是使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。rewrite循环最多可以执行10次,超过过nginx将返回500错误支持pcre语言,正则表达式,支持重写模块set指令
rewrite 语法
rewrite regex replacement [flag];正则 跳转后的内容 rewrite支持的flag标记 如果相对域名或参数字符串起作用,可以使用全局变量匹配,也可以使用proxy_pass反向代理。 从上 表明看rewrite和location功能有点像,都能实现跳转。主要区别在于rewrite是在同一域名内更改获取资源的路径,而location是对一类路径做控制访问或反向代理,可以proxy_pass到其他机器。
很多情况下rewrite也会写在location里,它们的执行顺序是:
1 执行server块的rewrite指令2 执行location匹配3 执行选定的location中的rewrite指令如果其中某步URI被重写,则重新循环执行1-3,直到找到真实存在的文件;循环超过10次,则返回500 Internal Server Error错误。
rewrite 实用场景
使用rewrite进行匹配跳转使用if匹配全局变量后跳转使用location匹配再跳转rewrite 放在 sever{},if{},location{}段中对域名或参数字符串使用if全局变量匹配使用proxy_pass反向代理
rewrite常用的正则表达式元字符
flag标记说明
last和break比较
location 详解之分类
location = patt {} [精准匹配]location = patt {} [一般匹配]location ~ patt {} [正则匹配]
正则匹配的常用表达式
location优先级
相同类型的表达式,字符串长的会优先匹配
按优先级排列
= 类型^~ 类型表达式正则表达式 (~和~*)类型常规字符串匹配类型,按前缀匹配通用匹配(/),如果没有其他匹配,任何请求都会匹配到
比较rewrite 和 location
相同点
都能实现跳转
不同点
rewrite实在同一个域名内更改获取资源的路径location是对一类路径做控制访问或反向代理,还可以proxy_到其他机器
rewrite会写在location里,执行顺序
执行server块里面的rewrite指令执行location匹配执行选定的location中的rewrite指令
server event 三种消息级别结构
优先级的实列
location = / { [ configuration A ] ##精确匹配/,主机名后面不能带任何字符串 } location / { [ configuration B ] ##所有的地址都以/开头,这条规则将匹配到所有请求,但正则 和最长字符串会优先匹配 } location /documents/ { [ configuration C ] ##匹配任何以 /documents/ 开头的地址,当后面的正则表达式没有匹配到时,才起作用 } location ~ /documents/abc { [ configuration D ] ##匹配任何以/documents/abc 开头的地址,当后面的正则表达式没有匹配到时,才会起作用 } location ^~ /images/ { [ configuration E ] ##以/images/开头的地址,匹配符号后,停止往下匹配 } location ~* \.(gif|jpg|peg)$ { [ configuration F] ##匹配所有以gif,jpg或jpeg结尾的请求,/images/下的图片会被 处理,因为^~的优先级更高 } location /images/abc { [ configuration G ] ##最长字符匹配到/images/abc,优先级最低 } location ~ /images/abc { [ configuration H ] ##以/images/abc开头的,优先级次之 } location /images/abc/1.html { [ configuration I ] ##如果和正则~ /images/abc/1.html相比,正则优先级更高 }
location优先级规则
匹配某个具体文件
(location = 完整路径)>(location ^~完整路径)> (location ~完整路径) > (location ~ 目录) > (location 目录) > (location /)
用目录做匹配访问某个文件
(location = 目录)> (location ^~ 目录/) > (location ~ 目录) > (location ~* 目录) > (location 目录) > (location /)
具体使用场景——1.基于域名的跳转
安装nginx官方源
[root@localhost ~]# rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm Retrieving http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm warning: /var/tmp/rpm-tmp.VbwudT: Header V4 RSA/SHA1 Signature, key ID 7bd9bf62: NOKEY Preparing... ################################# [100%] Updating / installing... 1:nginx-release-centos-7-0.el7.ngx ################################# [100%]
安装nginx,配置nginx
[root@localhost ~]# yum install nginx -y [root@localhost ~]# vim /etc/nginx/conf.d/default.conf 3 server_name chen.com; #第3行加入你的老域名 6 access_log /var/log/nginx/chen.com-access.log main; #第6行加入你老域名的日志消息
安装DNS服务解析
[root@localhost ~]# yum install bind -y
配置DNS主配置文件
[root@localhost ~]# vim /etc/named.conf 13 listen-on port 53 { any; }; 21 allow-query { any; };
配置DNS区域配置文件
[root@localhost ~]# vim /etc/named.rfc1912.zones zone "chen.com" IN { type master; file "chen.com.zone"; allow-update { none; }; };
配置DNS区域数据配置文件
[root@localhost ~]# cd /var/named/ [root@localhost named]# cp -p named.localhost chen.com.zone [root@localhost named]# cp -p chen.com.zone accp.com.zone $TTL 1D @ IN SOA @ rname.invalid. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS @ A 127.0.0.1 IN A 192.168.136.181 [root@localhost named]# systemctl start named [root@localhost named]# systemctl stop firewalld.service [root@localhost named]# setenforce 0 [root@localhost named]# systemctl start nginx [root@localhost named]# netstat -ntap | grep nginx tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 81426/nginx: master
去客户端去测试访问Nginx的页面
先将客户端DNS服务器选择我们DNS服务器的地址
配置Nginx主配置文件,做老域名转新域名
[root@localhost named]#vim /etc/nginx/conf.d/default.conf location / { #域名重定向 if ($host = "chen.com") { #如果你访问这个老域名 rewrite ^/(.*)$ permanent; #跳转为以/开头匹配多个任意字符结尾,这些参数,都为$1的变量永久性跳转 } root /usr/share/nginx/html; index index/html index.html; } ### 再为新域名去添加到DNS服务中去解析 [root@localhost named]# vim /etc/nginx/conf.d/default.conf zone "accp.com" IN { type master; file "accp.com.zone"; allow-update { none; }; }; [root@localhost named]# cp -p chen.com.zone accp.com.zone [root@localhost named]# systemctl restart named [root@localhost named]# systemctl restart nginx
再去客户端去验证访问老域名时会转到新域名
具体使用场景——2.基于客户端IP访问跳转
先查看客户端的地址,这个地址为不合法的
配置nginx主配置文件,把原来的删掉 3dd
[root@localhost ~]# vim /etc/nginx/conf.d/default.conf if ($host = "chen.com") { rewrite ^/(.*)$ permanent; } #设置是否合法的IP标志 set $rewrite true; #判断是否为合法的IP if ($remote_addr = "192.168.136.140"){ #140我们把这个地址设置成合法的IP set $rewrite false; } #非法IP进行判断打上标记 if ($rewrite = true){ rewrite (.+) /main.html; } #匹配标记进行跳转站点 location = /main.html { root /usr/share/nginx/html; } [root@localhost ~]# systemctl restart nginx [root@localhost ~]# cd /usr/share/nginx/html/ [root@localhost html]# ls 50x.html index.html
去创建一个维护页面(给不合法的地址访问的页面)
[root@localhost html]# vim main.html this is test web
去客户端先去测试一下不合法的页面(accp.com的地址是192.168.136.139)
再去测试一下合法的页面
先换成固定IP再去访问
具体使用场景——3.基于旧域名跳转到新域名后面加目录,比如现在访问的是html]# vim /etc/nginx/conf.d/default.conf ##把原来的删掉14dd 7 location /post { #匹配到/post才能进行下面的操作 8 rewrite (.+) permanent; #任意字符,accp.com/bbs $1调前面任意字符的参数,永久跳转 9 } [root@localhost named]# cd /var/named/ [root@localhost named]# vim accp.com.zone bbs IN A 192.168.136.182 [root@localhost named]# systemctl restart nginx [root@localhost named]# systemctl restart named
去服务器端网站测试一下
具体使用场景——4.基于参数匹配的跳转
[root@localhost named]# vim /etc/nginx/conf.d/default.conf #记得把原来的删掉 if ($request_uri ~ ^/100-(100|200)-(\d+).html$){ #$request_uri是内置变量,匹配开头为100到100或200,\d+代表1-9任意的数字,然后为结尾的html rewrite (.*) permanent; #就跳转到.*代表0次或多次这个域名的页面永久 } [root@localhost named]# vim accp.com.zone IN A 192.168.136.182 [root@localhost named]# systemctl restart nginx [root@localhost named]# systemctl restart named
去客户端测试一下
具体使用场景——5.基于目录下所有php文件跳转
[root@localhost named]# vim /etc/nginx/conf.d/default.conf #把原来的删掉3dd location ~* /upload/.*\.php$ { #匹配正则不区分大小写,upload代表一个目录。匹配php结尾的所有文件,\.转译.这个符号 rewrite (.*) permanent; #永久跳转首页 } [root@localhost named]# vim /etc/nginx/conf.d/default.conf [root@localhost named]# systemctl restart nginx
去客户端测试一下
具体使用场景——6.根据具体的页面跳转首页
[root@localhost named]# vim /etc/nginx/conf.d/default.conf #原来的第一条改成自己设置的一个具体页面 location ~* ^/abc/123.html { #以/abc/123.html 开头的 [root@localhost named]# systemctl restart nginx
去客户端测试一下
以上就是我们全部的内容了
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~