做受免费网站,自豪得用wordpress删,wordpress个人网站模板,wordpress首页添加文章列表大家好#xff0c;我是 17。
今天和大家聊聊 nginx http rewrite module 。
简单来说#xff0c; ngx_http_rewrite_module module 用正则匹配请求#xff0c;改写请求#xff0c;然后做跳转。可以是内部跳转#xff0c;也可以是外部跳转。
学习这个模块的时候#xf…大家好我是 17。
今天和大家聊聊 nginx http rewrite module 。
简单来说 ngx_http_rewrite_module module 用正则匹配请求改写请求然后做跳转。可以是内部跳转也可以是外部跳转。
学习这个模块的时候把 rewrite_log 打开可以在 error log 里查看跳转信息 rewrite_log on; error_log /home/log/test-error.log notice;注意 notice 是必须的 顺序执行和循环跳转
直接写在 server level 的 指令顺序执行。写在 location 中的指定顺序执行。可以跳到其它 location ,最多不超过 10次。
server{rewrite ^/users/(.*)$ /show?user$1 ;rewrite ^/teachers/(.*)$ /show?teacher$1 ;
}请求 /users/1 先执行第一条 rewrite ^/users/(.*)$ /show?user$1 再执行第二条 rewrite ^/teachers/(.*)$ /show?teacher$1 ; 虽然第一条匹配到了还是会执行第二条。这就是顺序执行的意思。
location /{rewrite ^/teachers/(.*)$ /show/$1;rewrite ^/users/(.*) /show/$1;
}
location /show/{rewrite ^/show/(.*)$ /users/$1 ;
}请求 /users/1命中第一个location 。顺序执行第一个 rewrite,没命中即使命中也会继续执行第二 rewrite 命中。执行 rewirte 指令跳转到第二个location /show/执行 rewirte 又回跳回 / 这样循环10次报 500 错误查看 error 日志可以看到说明。
rewrite or internal redirection cycle while processing /show/1这个过程演示了 location 中 rewrite 的执行逻辑。顺序执行循环跳转。
rewrite module 中还有 5 个指令 break, if, return, rewrite, and set。
return
return 可以直接返回打断后面的 rewrite module 指令的执行。
location / {return 409;rewrite ^/teachers/(.*)$ /show/$1;
}执行 return 后后面的指令就没有机会执行了。
return code [text];
return code URL;
return URL;location /admin/{return 403 没有访问权限;
}
location / {return 302 $scheme://www.baidu.com$request_uri;
}location /abc/{return 404;
}set,break 比较简单和其它语言差不多。下面着重讲下 rewirte 指令的 flag。
rewrite 指令的 flag
rewrite regex replacement [flag]
flag有四种
last 停止执行后面的 ngx_http_rewrite_module 指令并发起新的 location 匹配。break 停止执行后面的 ngx_http_rewrite_module 指令然后没有后续了不再发起 location 匹配。redirect 执行 302跳转后面的指令不再执行。permanent 执行 301跳转后面的指令不再执行。 last、break 停止执行的是 ngx_http_rewrite_module 指令其它指令不受影响还是会执行的。 regex 匹配的是路径部分 location / {rewrite ^/teacher/(.*)$ /show1/$1 last;rewrite ^/teacher/(.*) /show2/$1;
}
location /show1{return 900;
}
location /show2{return 901;
}curl http://localhost:3000/teacher/1
HTTP/1.1 900因为 last 会终止后面的 ngx_http_rewrite_module 指令所以 第二句 rewrite ^/teacher/(.*) /show2/$1 不会执行。第一句执行完后跳到 /show1返回 900如果把 last 换成 break
HTTP/1.1 404因为 break 不再执行跳转直接查找 show1/1 找不到报 404.把 last 换成 redirect.
HTTP/1.1 302 浏览器会请求两次。把 last 换成 permanent.
HTTP/1.1 301 浏览器会请求两次。
如果 replacement 是 http开头是可以直接跳转的
location / {rewrite ^/teacher/ http://juejin.cn
}curl http://localhost:3000/teacher/1
HTTP/1.1 302
Location: http://juejin.cn相当于 redirect 指令的效果。
if 语句
if 语句不复杂但是非常有用可以这样说用 if 可以实现很多指令,但是用内置指令更简洁还是要优先用指令。
if ($param) 如果 $param 为空字符串或 0 为假其它情况为真。 注意 if 后面必须要有空格否则报错。 set $param 0;
set $param 0;
set $param ;这三种写法 $param 都为假其它情况都为真用 ,!判断相等。 if ($request_method POST){return 403;}注意 是一个 不是两个, 等号左右必须要有空格否则报错 用正则表达式判断
~ 区分大小写
if ($http_user_agent ~ mobile)~* 不区分大小写
if ($http_referer ~* juejin\.cn)!~ 和 !~* 是对应的两个否定写法,不再举例了。用 flag
-f !-f 文件是否存在
if (-f $request_filename)
if (!-f $request_filename)-d !-d 目录是否存在
-e !-e 文件或目录是否存在
-x !-e 是否可执行## url 美化
http rewrite 一个应用就是 url 美化。
我们在开发的时候用的 url 是这样的
/users?id1
让别人访问的时候可能是这样的/users/1
所以我们需要把 /users/1 转为 /users?id1 ,这时就需要 rewrite 出场了。
location /users/{ rewrite ^/users/(.*)$ /nodejs/id$1? last; } location /nodejs/{ proxy_pass http://127.0.0.1:3000; }
当请求/users/1 的时候命中 location /users/ 执行rewrite 指令 last flag 指示停止后面的rewrite 指令并做内部跳转匹配到 location /nodejs/ 经过 proxy_pass 指令转到 /nodejs/ 。