location 匹配URI
location 匹配的规则和优先级;***重点
nginx常用的变量;要求掌握
rewrite 重定向;掌握/理解
正则表达式:匹配的是文件内容
常见的正则表达式:
. 匹配任意单个字符,包括汉字
^ 起始位置
$ 结束位置
* 匹配前面的字符0次或者多次
+ 匹配前面的字符1次或者多次
? 匹配前面的字符1次或者0次
\ 转义符;\.==.;
\d 匹配纯数字
[a-zA-Z0-9] 匹配所有大小写字符或者任意数字
[a] 匹配单个字符a
{n} 连续重复出现几次
{m,n} 最少出现m次,最多出现n次
() 分组
| 逻辑或
URI:统一资源标识符,是一种字符串标识,用于表示抽象的或者物理资源(文件、图片、视频)
location就是来匹配URI的
1.精确匹配:location= / {...}
2.正则匹配:location~ / {...}
3.通用匹配:location / {...}
= 精确匹配;完全匹配,必须完全一致
^~ 匹配普通字符,前缀匹配
~ 区分大小写的匹配
~* 不区分大小写的匹配
~$ 结束位置
!~ 取反;区分大小写,取得逻辑非;
!~* 取反;不区分大小写
location的匹配原则:越精确,优先级越高
精确匹配 > 正则匹配 > 通用匹配
location = > location ^~ > location ~* > location /test > location /
vim /usr/local/nginx/conf/nginx.conf
修改后:
nginx -t #查看语法是否有问题
systemctl restart nginx #重启nginx服务
location = /
直接匹配根网站,通过域名访问网站首页是最多的;使用精确匹配,可以加快处理速度
location ^~ /static/ {}
处理静态文件的请求,目录匹配
location ~* \.(gif|jpg|png|css) {...} #匹配图片用的
location / {
proxy_pass 指定代理,反向代理,转发动态请求;将.php .jsp的请求发送到后端
}
location /test/ { #指定匹配
}
rewrite使用nginx的全局变量或者是自己设置的变量,结合正则表达式和标志位实现URL的重写,以及重定向
rewrite只能放在server{},location{},if{}中,并且默认只能对域名后边的除去传递的参数外的字符串起作用
例:
http://www.kgc.com/a/we/index.php?id=1&u=str #只对/a/we/index.php重写。
1.先执行server块当中的rewrite
2.执行location匹配
3.如果location当中还有rewrite,继续执行
不停rewrite,死循环,只能10次,然后报错,状态码:500
rewrite [flag]
rewrite 开始重定向
regex 正则匹配的规则
replacemnet 表示跳转后的内容,你要重定向的url
flag 标志位;表示rewrite支持的flag标记
permanent 永久重定向;返回码:301
redirect 临时重定向;返回码:302
永久重定向,301;永久性的变更URL,搜索引擎会转移他的权重以及排名到新的URL
临时重定向,302;用于短期变更(例:网站维护,或者升级更新),搜索引擎不会转移权重和排名到新的URL
304 表示获取的是本地的缓存
last 本条规则匹配完成后,继续向下匹配新的location URI规则。
break 本条规则匹配完成即终止,不再匹配后面的任何规则,且URI不会发生变化。
redirect 返回302临时重定向,浏览器地址会显示跳转后的URL地址。
permanent 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。
permanent:
location / {
rewrite /test/(.*) /ky30/$1 permanent;
index index.html index.htm;
}
mkdir test
echo test > index.html
mkdir ky30
echo ky30 > index.html
返回301,永久重定向
是重定向,但是不会改变URI,而且只会请求一次;跳出当前匹配,立即终止
本条负责匹配完成后,继续向下匹配,只要有last就继续匹配;配置的时候需要注意,防止进入死循环
死循环的报错:rewrite or internal redirection cycle while processing #写成死循环,一直在匹配location;循环10次后终止,返回码500.
现在公司旧域名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/kgc.com-access.log; #日志修改
location / {
#添加域名重定向
if ($host = 'www.kgc.com'){ #$host为rewrite全局变量,代表请求主机头字段或主机名
rewrite ^/(.*)$ http://www.benet.com/$1 permanent; #在重定向时,$1表示请求的URL
}
root html;
index index.html index.htm;
}
}
echo "192.168.220.10 www.kgc.com www.benet.com" >> /etc/hosts
systemctl restart nginx
permanent: 永久性重定向,请求日志中的状态码为301。
今天公司业务新版本上线,要求所有 IP 访问任何内容都显示一个固定维护页面,
只有公司 IP :192.168.220.10访问正常。
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.kgc.com; #域名修改
charset utf-8;
access_log /var/log/nginx/kgc.com-access.log; #日志修改
#设置是否合法的IP标记
set $rewrite true; #设置变量$rewrite,变量值为boole值true
#判断是否为合法IP
if ($remote_addr = "192.168.220.10"){ #当客户端IP为192.168.220.10时,将变量值设为false,不进行重写
set $rewrite false;
}
#除了合法IP,其它都是非法IP,进行重写跳转维护页面
if ($rewrite = true){ #当变量值为true时,进行重写
rewrite (.+) /error.html; #重写在访问IP后边插入/error.html,例如192.168.220.22/error.html
}
location = /error.html {
root html; #网页返回html/error.html的内容
}
location / {
root html;
index index.html index.htm;
}
}
systemctl restart nginx
#只有 IP 为 192.168.220.10 能正常访问,其它地址都是维护页面
systemctl restart nginx.service
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.test.com; #域名修改
charset utf-8;
access_log /var/log/nginx/www.test.com-access.log;
location ~* /upload/.*\.php$ {
rewrite (.+) http://www.test.com permanent;
}
location / {
root html;
index index.html index.htm;
}
}
systemctl restart nginx
访问http://www.test.com/upload/123.php,直接跳转到www.test.com
$uri
$remote_addr 客户端的IP地址
$remote_port 客户端的端口号
$server_addr 服务器的IP地址
$server_port 服务器的端口号。表示如果没有在其他地方显示设置,content-type的字段,默认响应为text/plan;纯文本格式
text/html 默认的响应类型,也就是我们说的页面