炎炎夏日,深夜详谈nginx的配置中location和rewrite的语法规则(从入门到高手的第六步)
Posted 遙遙背影暖暖流星
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了炎炎夏日,深夜详谈nginx的配置中location和rewrite的语法规则(从入门到高手的第六步)相关的知识,希望对你有一定的参考价值。
前言
在生产实际中,当用户页面请求后,很多是需要自动跳转到其他特定页面,这个时候往往可以利用nginx配置中location规则或rewrite语法进行设置。
Nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。
rewrite只能放在server{},location{},if{}中,
并且只能对域名后边的除去传递的参数外的字符串起作用。
Rewrite主要的功能就是实现URL的重写,Nginx的Rewrite规则采用Pcre,perl兼容正则表达式的语法规则匹配,如果需要Nginx的Rewrite功能,在编译Nginx之前,需要编译安装PCRE库。
通过Rewrite规则,可以实现规范的URL、根据变量来做URL转向及选择配置
一、Rewrite
1、Rewrite跳转场景
URL看起来更规范、合理
企业会将动态URL地址伪装成静态地址提供服务
网址换新域名后,让旧的访问跳转到新的域名上
服务端某些业务调整
常用实景:
Nginx跳转需求的实现方式
使用 rewrite进行匹配跳转
使用if匹配全局变量后跳转
使用 location匹配再跳转
rewrite放在 server{},if{}, location{} 段中
对域名或参数字符串
使用if全局变量匹配
使用 proxy_pass反向代理
2、nginx的正则表达式
二,rewrite 命令
1、语法
rewrite <regex> <replacement> [flag];
正则 跳转后的内容 rewrite支持的flag标记
2、标记说法
last 相当于Apache的[L]标记,表示完成rewrite
break 本条规则匹配完成即终止,不再匹配后面的任何规则
redirect 返回302临时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更新url
permanent 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址,爬虫更新url
3 、last和break有什么不同
三、location
1、location语法规则
语法规则: location [=||*|^~] /uri/ {… }
2、分类
location = patt {} [精准匹配]
location ~ patt {} [正则匹配]
location patt {} [一般匹配 ]
匹配顺序,精确匹配>正则匹配>普通匹配
当匹配成功时停止匹配,按当前匹配的规则处理请求
3、 location的规则优先顺序
location = / {
#规则A
}
location = /login {
#规则B
}
location ^~ /static/ {
#规则C
}
location ~ \\.(gif|jpg|png|js|css)$ {
#规则D
}
location ~* \\.png$ {
#规则E
}
location !~ \\.xhtml$ {
#规则F
}
location !~* \\.xhtml$ {
#规则G
}
location / {
#规则H
}
那么产生的效果如下:
- 访问根目录/,比如http://localhost/将匹配规则A
- 访问 http://localhost/login 将匹配规则B,http://localhost/register则匹配规则H
- 访问 http://localhost/static/a.html 将匹配规则C
- 访问 http://localhost/a.gif,http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用,而http://localhost/static/c.png则优先匹配到规则C
- 访问 http://localhost/a.PNG 则匹配规则E,而不会匹配规则D,因为规则E不区分大小写。
- 访问 http://localhost/a.xhtml 不会匹配规则F和规则G,http://localhost/a.XHTML不会匹配规则G,因为不区分大小写。规则F,规则G属于排除法,符合匹配规则但是不会匹配到,所以想想看实际应用中哪里会用到。
- 访问 http://localhost/category/id/1111 则最终匹配到规则H,因为以上规则都不匹配,这个时候应该是nginx转发请求给后端应用服务器,比如FastCGI(php),tomcat(jsp),nginx作为方向代理服务器存在。
匹配某个具体文件
( location = 完整路径)>( location ^~ 完整路径)>( location ~* 完整路径)>( location ~ 完整路径)>( location完整路径)>( location /)
用目录做匹配访问某个文件
( location = 目录)>( location ^~ 目录)>( location ~ 目录)>
( location ~* 目录)>( location 目录)>( location /)
4、rewrite和 location有什么不同?
(1)相同点
都能实现跳转
(2)不同点
rewrite是在同一域名内更改获取资源的路径
location是对一类路径做控制访问或反向代理,还可以 proxy_pass到其他机器
(3)rewrite会写在 location里,执行顺序
执行 server块里面的 rewrite指令
执行 location匹配
执行选定的 location中的 rewrite指令
四,实际应用
1、基于域名跳转
情景:当访问就域名www.cat.com时自动跳转到新域名www.dog.com
实验环境:nginx为新安装,纯净模式即可
步骤:
echo “192.168.100.7 www.cat.com www.dog.com” >> /etc/hosts #添加映射
cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak #设置配置文件时养成先备份的习惯
mkdir -p /var/log/nginx #创建日志目录
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.cat.com; #旧域名
#charset koi8-r;
access_log /var/log/nginx/www.cat.com-access.log ; #日志位置
location / {
if ($host = 'www.cat.com'){ ##$host为rewrite全局变量,代表请求主机头字段或主机名,注意=两边有空格哦
rewrite ^/(.*)$ http://www.dog.com/$1 permanent; #跳转新域名
}
root html;
index index.html index.htm;
}
2、基于不同IP地址的跳转
情景:今天公司业务新版本上线,要求所有IP 访问任何内容都显示一个固定维护页面,只有公司IP 192.168.100.7访问正常。
步骤:
恢复原来的设置 cp /usr/local/nginx/conf/nginx.conf b.ak /usr/local/nginx/conf/nginx.conf
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.cat.com;
#charset koi8-r;
access_log /var/log/nginx/www.cat.com-access.log ;
set $rewrite true;
if ($remote_addr = "192.168.100.7"){
set $rewrite false;
}
if ($rewrite = true){
rewrite (.+) /weihu.html;
}
location = /weihu.html {
root html;
index index.html index.htm;
}
nginx -t
systemctl restart nginx.service
除了192.168.100.7主机能正常登录,其他的主机无法访问
3、基于旧域名跳转到新域名后面加目录
需求:当访问的是 http://www.cat.com/post/1.html,将这个域名下面的访问都跳转到 http://www.dog.com/bbs/post/1.html下
(即/post/1.html保持一致,但跳转新页面后要变成/bbs/psot/1.html)
echo “192.168.100.7 www.cat.com www.dog.com” >> /etc/hosts #添加映射
mkdir -p /usr/local/nginx/html/bbs/post
echo "<h1> this is 1.html </h1>" >> /usr/local/nginx/html/bbs/post/1.html
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.cat.com;
#charset koi8-r;
access_log /var/log/nginx/www.dog.com-access.log; #修改日志
location /post {
rewrite (.*) http://www.dog.com/bbs$1 permanent; #这里$1为位置变量,代表/post
}
location / {
root html;
index index.html index.htm;
}
nginx -t
systemctl restart nginx.service
验证登录 http://www.cat.com/post/1.html,会自动跳转http://www.dog.com/bbs/post/1.html
4、基于参数匹配(多余)的跳转
需求:访问http://www.cat.com/100-(100|200) -100.html会跳转到 http://www .dog.com的页面
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.cat.com; #修改域名
#charset koi8-r;
access_log/var/log/nginx/www.cat.com-access.log; #日志
if ($request_uri ~ ^/100-(100|200)-(\\d+)\\.html$) { # $request_uri内置变量,表示URI,\\d纯数字
#设置正则匹配,示例: http:// www.cat.com/100-100-1231.html
rewrite (.* ) http://www.dog.com permanent; # 设置重写
}
location / {
root html;
index index.html index .htm;
}
nginx -t
systemctl restart nginx.service
这个登录www.cat.com/100-100-100.html
5、基于目录下所有php结尾的文件跳转
要求:访http://www.cat.com/upload/123.php 跳转到首页www,dog.com
(也就是登录/upload/****/php时,自动跳转)
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.cat.com;
#charset koi8-r;
access_log /var/log/nginx/www.dog.com-access.log;
location ~* /upload/.*\\.php$ {
rewrite (.+) http://www.dog.com permanent;
}
location / {
root html;
index index.html index.htm;
}
nginx -t
systemctl restart nginx.service
登录http://www.cat.com/upload/123.php ,自动跳转
6、基于最普通一条url请求的跳转
要求:要求访问一个具体的子页面,如:http: / / www.cat.com/abc/123.html,跳转到首页
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.cat.com;
#charset koi8-r;
access_log /var/log/nginx/www.cat.com-access.log;
location ~* /abc/123.html {
rewrite (.+) http://www.cat.com permanent;
}
location / {
root html;
index index.html index.htm;
}
nginx -t
systemctl restart nginx.service
登录www.cat.com/abc/123.html
自动跳转
以上是关于炎炎夏日,深夜详谈nginx的配置中location和rewrite的语法规则(从入门到高手的第六步)的主要内容,如果未能解决你的问题,请参考以下文章