nginx动静分离和rewrite规则(八)
2018-05-25 本文已影响26人
andpy
nginx动静分离
通过中间件将动态请求和静态请求分离,减少不必要的请求资源消耗,减少请求延迟。
image
//示例
upstream applelife {
#本机tomacat默认地址
server 127.0.0.1:8080;
}
server {
listen 80;
server_name www.applelife.xyz;
#设置资源目录
root /opt/app/code;
#动态请求走 tomacat
location ~ \.jsp$ {
proxy_pass http://applelife;
index index.html index.htm;
}
#静态资源走nginx
location ~ \.(jpg|png|gif)$ {
#配置缓存头信息等
expires 1h;
#开启压缩
gzip on;
}
location / {
index index.html index.htm;
}
}
nginx语法检查
nginx -tc /etc/nginx/nginx.conf
nginx的rewrite规则
实现url重写以及重定向
场景:
- url访问跳转,支持开发设计(页面跳转,兼容性支持,展示效果等)
- SEO优化
- 维护(后台维护,流量转发等)
- 安全
//语法 regex 需要匹配的正则表达式,替换的内容,flag 标识
Syntax:rewrite regex replacement [flag];
Default:-
Context:server,location,if;
//示例 重定向页面,做维护的时候,所有的请求都会跳转到维护页
rewrite ^(.*)$ /pages/maintain.html break;
//简单正则说明
. 匹配除换行符以外的任意字符
? 重复 0次或1次
+ 重复一次 或者多次
* 贪婪匹配
\d 匹配数字
^ 匹配字符串的开始 以什么开头
$ 匹配字符串的结尾 以什么结尾
{n} 重复n次
{n,} 重复n次或更多次
[c] 匹配单个字符 c
[a-z] 匹配a-z 小写字母的任意一个
\ 转义符 rewrite index\.php$/pages/maintain.html break; //匹配 index.php结尾
() 用于匹配括号之间的内容 通过 $1,$2调用
//示例 看头信息是否有 MSIE的内容 ,有的话提取出参数,放到 $1的位置
if ($http_user_agent ~ MSIE){
rewrite ^(.*)$ /msie/$1 break;
}
在linux测试正则 终端测试命令 pcretest
rewrite flag
- last 停止rewrite 检测
- break 停止 rewrite 检测
- redirect 返回302 临时重定向 地址栏会显示跳转后的地址
- permanent 返回301 永久重定向,地址栏会显示跳转后的地址
last和break的区别:
//示例
server {
...
root /opt/app/code
#以break开头匹配,匹配之后,匹配rewrite规则
location ~ ^/break {
#匹配之后,去opt/app/code/test/查看 目录查看,不会重新发起请求
rewrite ^/break /test/ break;
}
#以last开头匹配 匹配之后,匹配rewrite规则
location ~ ^/last {
#匹配之后会重新发起请求 url 为 /test/ 及匹配到下面的 location /test/ 返回200
rewrite ^/last /test/ last;
}
location /test/ {
default_type application/json;
return 200 '{"status:":"success"}';
}
...
}
permanent和 redirect区别
//示例
server {
...
location ~^/imooc {
#永久重定向,除非清除缓存,否则会一直有效,客户端会长期保有这种结果,下次请求 不会请求服务器
rewrite ^/imooc http://www.baidiu.com/ permanent;
#临时重定向还是会再次请求服务器
rewrite ^/imooc http://www.baidu.com / redirect;
}
}
示例:在目录下有多个分级
//示例这种格式的路径
opt/app/code/course/11/22/courese_33.html
//一般请求地址为 这种不利于seo的优化
http://servername/course/11/22/course_33.html
//示例
server {
listen 80;
server_name localhost;
root /opt/app/code;
location / {
#将uri中的地址参数提取出来 组成新的路径 $1是第一个括号的内容,$2是第二个括号的内容,...
rewrite ^/course-(\d+)-(\d+)-(\d+)\.html$ /course/$1/$2/course_$3.html break;
# http://localhsot/nginx/.. 如果是chrom请求并且 匹配 nginx开头路径,就转到其它地址
#if ($http_user_agent ~* Chrome) {
# rewrite ^/nginx http://coding.imooc/#class/121.html redirect;
#}
#-f 判断路径是否存在, 请求文路径是否存在,不存在提取所有的参数 转发到百度页面 http://localhost/applelife
#if (!-f $request_filename) {
# rewrite ^/(.*)$ http://www.imocc.com/$1 #redirect;
#}
index index.html index.htm;
}
...
}
Rewrite规则优先级
- 执行server快的rewrite指令
- 执行location匹配
- 执行选定的location中的rewirte
优雅的书写Rewrite规则
//示例
server {
listen 80;
server_name www.nginx.org nginx.org;
if ($http_host = nginx.org){
rewrite (.*) http://www.nginx.org$1;
}
}
//优雅示例
server {
listen 80;
server_name nginx.org;
rewrite ^ http://www.nginx.org$request_uri?;
}
server {
listen 80;
server_name www.nginx.org;
...
}
nginx语法检测
nginx -tc /etc/nginx/nignx.conf