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重写以及重定向

场景:

//语法 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和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规则优先级

  1. 执行server快的rewrite指令
  2. 执行location匹配
  3. 执行选定的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
上一篇下一篇

猜你喜欢

热点阅读