一、 Rewrite 基本描述
rewrite 主要实现 url 地址重写,以及重定向。
使用场景
-
URL 访问跳转: 支持开发设计,页面跳转,兼容性支持
-
SEO 优化: 依赖于url路径,以便支持搜索引擎录入
-
维护: 后台维护,流量转发等
-
安全: 伪静态,真实动态页面进行伪装
二、 Rewrite 配置语法
Syntax: rewrite regex replacement [flag];
Default: --
Context: server, location, if
rewrite ^(.*)$ /pages/maintain.html break; // 所有请求转发至 /pages/maintain.html break;
2.1 正则表达式
表达式
|
|
.
|
匹配除换行符以外的任意字符
|
?
|
重复0次或1次
|
+
|
重复1次或更多次
|
*
|
任意次数
|
\d
|
匹配数字
|
^
|
匹配字符串的开始
|
$
|
匹配字符串的结尾
|
{n}
|
重复n次
|
{n+}
|
重复n次或更多次
|
2.2 正则表达式中的特殊字符
\ : 转义字符
rewrite index.php$ /pages/index.php break;
() :用于匹配括号之间的内容,通过 $1、$2调用
if ($http_user_agent ~ Chrome) {
rewrite ^(.*)$ /chrome/$1 break;
}
--> 实现效果:
http://localhost/test001.html --> http://localhost/chrome/test001.html
2.3 正则表达式终端测试工具
# yum install -y pcre-tools
# pcretest
re> /(\d+)\.(\d+)\.(\d+)\.(\d+)/
data> 192.168.10.19
0: 192.168.10.19
1: 192
2: 168
3: 10
4: 19
三、 Rewrite 标记Flag
flag
|
|
last
|
停止rewrite检测
|
break
|
停止rewrite检测
|
redirect
|
返回302临时重定向,地址栏会显示跳转后的地址
|
permanent
|
返回301永久重定向,地址栏会显示跳转后的地址
|
3.1 对比flag中 break 与 last
last 会新建立一个请求,请求域名+/test
break 匹配后不会进行匹配,会查找对应的root站点目录下包含 /test 目录
server {
listen 80;
server_name localhost;
root /soft/code;
location ~ ^/break {
rewrite ^/break /test/ break;
}
location ~ ^/last {
rewrite ^/last /test/ last;
}
location /test/ {
default_type applicaiton/json;
return 200 '{"status":"success"}';
}
}
3.2 比对flag中 redirect 与 permanent
permanent 跳转,在关闭掉Nginx服务器后,浏览器依旧可以跳转,但清除缓存后,不能跳转
server {
listen 80;
server_name localhost;
root /soft/code;
location ~ ^/px {
rewrite ^/px http://king.bearpx.com redirect;
rewrite ^/px http://king.bearpx.com permanent;
}
}
四、 Rewtire使用场景
当对外展示URI时,需要隐藏真实目录结构
server {
listen 80;
server_name localhost;
root /soft/code;
index index.html;
location / {
rewrite ^/px-(\d+)-(\d+)\.html /px/$1/px_$2.html break;
}
}
当Chrome浏览器访问/px时,直接跳转到 index.html;
server {
if($http_user_agent ~* Chrome){
rewrite ^/px http://px.bearpx.com/index.html redirect;
}
}
五、Rewrite 匹配优先级
- 执行server块的 rewrite指令
- 执行location匹配
- 执行选定的location中的rewrite
5.1 Rewrite 优雅书写
server {
listen 80;
server_name www.bearpx.com bearpx.com;
if ($http_host = nginx.org){
rewrite (.*) http://www.bearpx.com$1;
}
}
// 改进写法
server {
listen 80;
server_name www.bearpx.com bearpx.com;
rewrite ^ http://www.bearpx.com$request_uri?;
}
--> 实现效果
bearpx.com/bear/bear.html --> http://www.bearpx.com/bear/bear.html