网站建设要不要学编码,wordpress表插件,制作网站规划书,上海跨境电商公司1. location
从功能看 rewrite 和 location 似乎有点像#xff0c;都能实现跳转#xff0c;主要区别在于 rewrite 是在同一域名内更改获取资源的路径#xff0c;而 location 是对一类路径做控制访问或反向代理#xff0c;还可以proxy_pass 到其他机器。
rewrite 对访问的…1. location
从功能看 rewrite 和 location 似乎有点像都能实现跳转主要区别在于 rewrite 是在同一域名内更改获取资源的路径而 location 是对一类路径做控制访问或反向代理还可以proxy_pass 到其他机器。
rewrite 对访问的域名或者域名内的URL路径地址重写。 location 对访问的路径做访问控制或者代理转发。
1.1location类别
精准匹配location / {}
一般匹配location / {}
正则匹配location ~ / {}
常用正则表达式
匹配符 表示含义 ^ 匹配输入字符串的起始位置 $ 匹配输入字符串的结束位置 * 匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll” 匹配前面的字符一次或多次。如“ol”能匹配“ol”及“oll”、“olll”但不能匹配“o” ? 匹配前面的字符零次或一次例如“do(es)?”能匹配“do”或者“does””?”等效于”{0,1}” . 表示任意一个字符 \转义字符 用于取消特殊符号的含义 \d 匹配纯数字 \s 匹配空的空格或者制表符 {n} 匹配前面的子表达式n次 {n,} 匹配前面的子表达式不少于n次 {n,m} 匹配前面的子表达式n到m次 [ ] 匹配括号中的一个字符 [c] 匹配单个字符 c [a-z] 匹配 a-z 小写字母的任意一个 [a-zA-Z0-9] 匹配所有大小写字母或数字 () 表达式的开始和结束位置 | 或运算符
1.2 常用的匹配规则
规则表达式 规则含义 进行普通字符精确匹配。也就是完全匹配 ^~ 表示普通字符匹配。使用前缀匹配。如果匹配成功则不再匹配其他 location ~ 表示执行一个正则匹配区分大小写 ~* 表示执行一个正则匹配不区分大小写 !~ 表示执行一个正则匹配区分大小写不匹配 !~* 表示执行一个正则匹配不区分大小写不匹配
1.3 location 优先级
首先精确匹配 其次前缀匹配 ^~其次是按文件中顺序的正则匹配 ~或~*然后匹配不带任何修饰的前缀匹配最后是交给 / 通用匹配
location 示例说明
1location / {}
为精确匹配 / 主机名后面不能带任何字符串比如访问 / 和 /data则 / 匹配/data 不匹配
再比如 location /abc则只匹配/abc /abc/或 /abcd不匹配。若 location /abc则即匹配/abc 、/abcd/ 同时也匹配 /abc/。2location / {}
因为所有的地址都以 / 开头所以这条规则将匹配到所有请求 比如访问 / 和 /data, 则 / 匹配 /data 也匹配
但后面前缀路径会和最长字符串优先匹配最长匹配3location /documents/ {}
匹配任何以 /documents/ 开头的地址匹配符合以后还要继续往下搜索其它 location
只有其它 location后面的前缀路径没有匹配到时才会采用这一条4location /documents/abc {}
匹配任何以 /documents/abc 开头的地址匹配符合以后还要继续往下搜索其它 location
只有其它 location后面的前缀路径没有匹配到时才会采用这一条5location ^~ /images/ {}
匹配任何以 /images/ 开头的地址匹配符合以后停止往下搜索正则采用这一条6location ~* \.(gif|jpg|jpeg)$ {}
匹配所有以 gif、jpg或jpeg 结尾的请求
然而所有请求 /images/ 下的图片会被 location ^~ /images/ 处理因为 ^~ 的优先级更高所以到达不了这一条正则7location /images/abc {}
最长字符匹配到 /images/abc优先级最低继续往下搜索其它 location会发现 ^~ 和 ~ 存在8location ~ /images/abc {}
匹配以/images/abc 开头的优先级次之只有去掉 location ^~ /images/ 才会采用这一条9location /images/abc/1.html {}
匹配/images/abc/1.html 文件如果和正则location ~ /images/abc/1.html 相比正则优先级更高优先级总结(location 完整路径) (location ^~ 路径) (location ~,~* 正则顺序) (location 部分起始路径) (location /)
location 匹配 首先看 优先级精确 前缀^~ 正则~,~* 一般 通用/ 优先级相同正则看上下顺序上面的优先一般匹配看长度最长匹配的优先 精确、前缀、正则、一般 都没有匹配到最后再看通用匹配
2. rewrite
rewrite功能
rewrite功能就是使用nginx提供的全局变量或自己设置的变量结合正则表达式和标记位实现URL重写以及重定向。 比如更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求。
rewrite只能放在server{},location{},if{}中并且默认只能对域名后边的除去传递的参数外的字符串起作用 例如 http://www.kgc.com/abc/bbs/index.php?a1b2 只对/abc/bbs/index.php重写。
2.1 rewrite跳转实现
Nginx通过ngx_http_rewrite_module 模块支持URL重写、支持if条件判断但不支持else 跳转从一个 location跳转到另一个location循环最多可以执行10次超过后nginx将返回500错误 PCRE支持perl兼容正则表达式的语法规则匹配 重写模块 set 指令创建新的变量并设其值 2.2 执行顺序
rewrite 执行顺序如下 (1) 执行 server 块里面的 rewrite 指令。 (2) 执行 location 匹配。 (3) 执行选定的 location 中的 rewrite 指令。
2.3 跳转实现 Nginx通过ngx_http_rewrite_module 模块支持URL重写、支持if条件判断但不支持else 跳转从一个 location跳转到另一个location循环最多可以执行10次超过后nginx将返回500错误 PCRE支持perl兼容正则表达式的语法规则匹配 重写模块 set 指令创建新的变量并设其值
2.4 语法格式
rewrite regex replacement [flag]; regex 表示正则匹配规则。 replacement 表示跳转后的内容。 flag 表示 rewrite 支持的 flag 标记。
3. 实例
基于域名的跳转 现在公司旧域名www.kgc.com有业务需求变更需要使用新域名www.benet.com代替但是旧域名不能废除
修改主配置文件
vim /usr/local/nginx/conf/nginx.conf
server {listen 80;server_name www.kgc.com; #域名修改 charset utf-8;access_log /var/log/nginx/www.kgc.com-access.log; #日志修改location / {#添加域名重定向if ($host www.kgc.com){ #$host为rewrite全局变量代表请求主机头字段或主机名rewrite ^/(.*)$ http://www.benet.com/$1 permanent; #$1为正则匹配的内容即“域名/”之后的字符串}root html;index index.html index.htm;}
}echo 192.168.66.10 www.kgc.com www.benet.com /etc/hosts
systemctl restart nginx 创建所需目录及文件 网页验证
浏览器输入模拟访问 http://www.kgc.com/test/1.html(虽然这个请求内容是不存在的)
会跳转到www.benet.com/test/1.html查看元素可以看到返回301实现了永久重定向跳转而且域名后的参数也正常跳转。 2. 基于客户端 IP 访问跳转 今天公司业务新版本上线要求所有 IP 访问任何内容都显示一个固定维护页面只有公司 IP 192.168.66.10访问正常。
vim /usr/local/nginx/conf/nginx.conf
server {listen 80;server_name www.kgc.com; #域名修改 charset utf-8;access_log /var/log/nginx/www.kgc.com-access.log; #日志修改#设置是否合法的IP标记set $rewrite true; #设置变量$rewrite变量值为boole值true#判断是否为合法IPif ($remote_addr 192.168.66.10){ #当客户端IP为192.168.80.10时将变量值设为false不进行重写set $rewrite false;}#除了合法IP其它都是非法IP进行重写跳转维护页面if ($rewrite true){ #当变量值为true时进行重写rewrite (.) /weihu.html; #将域名后边的路径重写成/weihu.html后转发例如www.kgc.com/weihu.html}location /weihu.html {root /var/www/html; #网页返回/var/www/html/weihu.html的内容}location / {root html;index index.html index.htm;}
} 设置维护界面并重启服务
vim /var/www/html/weihu.html 使用192.168.66.20访问时 使用192.168.66.10访问时