文章目录
展开Nginx实现Rewrite重写
什么是rewrite
Rewrite主要实现url地址重写,以及重定向,就是把传入web的请求重定向到其他url的过程。
做伪静态,将动态页面url转换成静态的页面url。
Rewrite使用场景
-
地址跳转
- 比如淘宝的 www.taobao.com 由手机端访问会跳转成: main.m.taobao.com-
-
协议跳转
-
伪静态
- 将动态页面显示为静态页面方式的一种技术,便于搜索引擎的录入,同时建上动态URL地址对外暴露过多的参数,提升更高的安全性。
- 搜索引擎,SEO优化依赖于url路径,好记的url便于智齿搜索引擎录入
伪静态的配置
句法:Syntax: rewrite regex replacement [flag]
默认:Default: --
语境:Context: server,location,if
rewrite:模块
regex:正则表达式(匹配当前的url)
replacement:要替换成的url
[flag]:要配置的fiag方式 没配的话也可以跳转 但不显示跳转以后的域名 还是你输入的域名 但不影响去匹配
rewrite https://wodeyumengouwo.com https://www.wodeyumengouwo.com;
#用于切换维护页面场景
#rewrite ^(.*)$ /page/maintain.html break;
如果懂shell脚本的,这两个就类似于脚本中的,break和continue
rewrite语法
rewrite 正则表达式 新url或location [flag];
rewrite的fiag
地址跳转
- 比如淘宝的 www.taobao.com 由手机端访问会跳转成: main.m.taobao.com-
协议跳转
伪静态
- 将动态页面显示为静态页面方式的一种技术,便于搜索引擎的录入,同时建上动态URL地址对外暴露过多的参数,提升更高的安全性。
- 搜索引擎,SEO优化依赖于url路径,好记的url便于智齿搜索引擎录入
句法:Syntax: rewrite regex replacement [flag]
默认:Default: --
语境:Context: server,location,if
rewrite:模块
regex:正则表达式(匹配当前的url)
replacement:要替换成的url
[flag]:要配置的fiag方式 没配的话也可以跳转 但不显示跳转以后的域名 还是你输入的域名 但不影响去匹配
rewrite https://wodeyumengouwo.com https://www.wodeyumengouwo.com;
#用于切换维护页面场景
#rewrite ^(.*)$ /page/maintain.html break;
如果懂shell脚本的,这两个就类似于脚本中的,break和continue
rewrite 正则表达式 新url或location [flag];
概述 | flag |
---|---|
匹配到last的规则后可以继续匹配后面的location(脚本中循环的break) | last |
匹配到break的规则后,无法再匹配后面的location(脚本中循环的continue) | break |
302临时重定向,不清理缓存的情况下,停掉nginx服务,页面无法跳 | redirect |
301永久重定向,不清理缓存的情况下,停掉nginx服务,页面继续跳转 | permanent |
redirect 临时重定向
# redirect临时重定向配置
[root@web01 ~]# vim /etc/nginx/conf.d/redirect.conf
server {
listen 80;
server_name redirect.hg.com;
root /code;
index index.html;
location /test {
rewrite ^(.*)$ https://www.baidu.com redirect;
}
}
# 第二种配置 不走redirect的规则 直接由指定的uri跳转 也不会记录到日志 是写死的方法
[root@web01 ~]# vim /etc/nginx/conf.d/redirect.conf
server {
listen 80;
server_name redirect.hg.com;
root /code;
index index.html;
location /test {
#rewrite ^(.*)$ https://www.baidu.com redirect;
return 307 http://baidu.com;
}
}
# 重新加载nginx
[root@web01 ~]# systemctl reload nginx
# 域名解析
10.0.0.7 redirect.hg.com
#浏览器中输入 redirect.hg.com/test
# redirect临时重定向配置
[root@web01 ~]# vim /etc/nginx/conf.d/redirect.conf
server {
listen 80;
server_name redirect.hg.com;
root /code;
index index.html;
location /test {
rewrite ^(.*)$ https://www.baidu.com redirect;
}
}
# 第二种配置 不走redirect的规则 直接由指定的uri跳转 也不会记录到日志 是写死的方法
[root@web01 ~]# vim /etc/nginx/conf.d/redirect.conf
server {
listen 80;
server_name redirect.hg.com;
root /code;
index index.html;
location /test {
#rewrite ^(.*)$ https://www.baidu.com redirect;
return 307 http://baidu.com;
}
}
# 重新加载nginx
[root@web01 ~]# systemctl reload nginx
# 域名解析
10.0.0.7 redirect.hg.com
#浏览器中输入 redirect.hg.com/test
临时重定向配置一结果
临时重定向配置二结果
permanent 永久重定向
# permanent永久重定向配置
[root@web01 ~]# vim /etc/nginx/conf.d/permanent.conf
server {
listen 80;
server_name permanent.hg.com;
root /code;
index index.html;
location /test {
rewrite ^(.*)$ https://www.baidu.com permanent;
}
}
# 第二种配置 不走permanent的规则 直接由指定的uri跳转 也不会记录到日志 是写死的方法
[root@web01 ~]# vim /etc/nginx/conf.d/permanent.conf
server {
listen 80;
server_name permanent.hg.com;
root /code;
index index.html;
location /test {
#rewrite ^(.*)$ https://baidu.com permanent;
return 307 http://www.baidu.com;
}
}
# 重新加载nginx
[root@web01 ~]# systemctl reload nginx
# 域名解析
10.0.0.7 permanent.hg.com
#浏览器中输入 permanent.hg.com/test
# permanent永久重定向配置
[root@web01 ~]# vim /etc/nginx/conf.d/permanent.conf
server {
listen 80;
server_name permanent.hg.com;
root /code;
index index.html;
location /test {
rewrite ^(.*)$ https://www.baidu.com permanent;
}
}
# 第二种配置 不走permanent的规则 直接由指定的uri跳转 也不会记录到日志 是写死的方法
[root@web01 ~]# vim /etc/nginx/conf.d/permanent.conf
server {
listen 80;
server_name permanent.hg.com;
root /code;
index index.html;
location /test {
#rewrite ^(.*)$ https://baidu.com permanent;
return 307 http://www.baidu.com;
}
}
# 重新加载nginx
[root@web01 ~]# systemctl reload nginx
# 域名解析
10.0.0.7 permanent.hg.com
#浏览器中输入 permanent.hg.com/test
永久重定向配置一结果
永久重定向配置二结果
break和last的配置方法
[root@web01 ~]# cat /etc/nginx/conf.d/rewrite.conf
server {
listen 80;
server_name rewrite.hg.com;
root /code;
location ~ ^/break {
rewrite ^/break /test/ break;
}
location ~ ^/last {
rewrite ^/last /test/ last;
}
location /test/ {
default_type app/json;
return 200 "ok";
}
}
## 当访问rewrite.hg.com/break 会匹配到break的规则后,无法再匹配后面的location
## 当访问rewrite.hg.com/last 会匹配到last的规则 可以继续匹配后面的location
rewrite实践
开启rewrite日志方法
# 开启rewrite日志,错误日志的级别要改成 notice,在http层加上rewrite_log on;
[root@web01 ~]# vim /etc/nginx/nginx.conf
/var/log/nginx/error.log notice;
http{
rewrite_log on;
...
}
# 重启nginx
[root@web01 nginx]# systemctl restart nginx
案例一
[root@web01 ~]# cat /etc/nginx/conf.d/rewrite.conf
server {
listen 80;
server_name rewrite.hg.com;
root /code;
location ~ ^/break {
rewrite ^/break /test/ break;
}
location ~ ^/last {
rewrite ^/last /test/ last;
}
location /test/ {
default_type app/json;
return 200 "ok";
}
}
## 当访问rewrite.hg.com/break 会匹配到break的规则后,无法再匹配后面的location
## 当访问rewrite.hg.com/last 会匹配到last的规则 可以继续匹配后面的location
# 开启rewrite日志,错误日志的级别要改成 notice,在http层加上rewrite_log on;
[root@web01 ~]# vim /etc/nginx/nginx.conf
/var/log/nginx/error.log notice;
http{
rewrite_log on;
...
}
# 重启nginx
[root@web01 nginx]# systemctl restart nginx
案例一
需求:用户访问 /abc/1.html 实际上真实访问的是 /ccc/bbb/2.html
[root@web01 ~]# vim /etc/nginx/conf.d/anliyi.conf
server {
listen 80;
server_name www.hg.com;
root /code;
index index.html;
location /abc/1.html {
rewrite ^(.*)$ /ccc/bbb/2.html redirect;
}
}
# /abc/1.html是伪静态 不需要创建 但需要创建/ccc/bbb/2.html
[root@web01 ~]# mkdir -p /code/ccc/bbb
[root@web01 ~]# echo '666' > /code/ccc/bbb/2.html
# 重启nginx
[root@web01 ~]# systemctl restart nginx
##写入域名解析 10.0.0.7 www.hg.com 打开浏览器访问www.hg.com/abc/1.html
案例二
需求:用户访问 /2018/ccc/bbb/2.html 实际上真实访问的是 /2014/ccc/bbb/2.html 需要是变量数据 方便调用
# rewrite写死的方法
[root@web01 ~]# vim /etc/nginx/conf.d/anlier.conf
server {
listen 80;
server_name www.hg.com;
root /code;
index index.html;
location /2018/ccc/bbb {
rewrite ^(.*)$ /2014/ccc/bbb/2.html redirect;
}
}
# 正则后向引用匹配
[root@web01 ~]# vim /etc/nginx/conf.d/anlier.conf
server {
listen 80;
server_name www.hg.com;
root /code;
index index.html;
location /2018 {
rewrite ^/2018/(.*) /2014/$1 redirect;
}
}
# /2018/ccc/bbb是伪静态 不需要创建 但需要创建/2014/ccc/bbb/2.html
[root@web01 ~]# mkdir -p /code/2014/ccc/bbb
[root@web01 ~]# echo '111' > /code/2014/ccc/bbb/2.html
# 重启nginx 并写入域名解析 10.0.0.7 www.hg.com 打开浏览器访问www.hg.com/2018/ccc/bbb/2.html
案例三
需求:用户访问course-11-22-33.html实际上真实访问的是/course/11/22/33/course_33.html 需要是变量数据 方便调用
[root@web01 ~]# vim /etc/nginx/conf.d/anlisan.conf
server {
listen 80;
server_name www.hg.com;
root /code;
index index.html;
location /course {
rewrite course-(.*)-(.*)-(.*).html /course/$1/$2/$3/course_$3.html redirect;
}
}
# 创建文件
[root@web01 ~]# mkdir -p /code/course/11/22/33/
[root@web01 ~]# echo '333' > /code/course/11/22/33/course_33.html
## 重启nginx 然后浏览器输入 www.hg.com/course-11-22-33.html 访问
案例四
需求:80端口强制跳转443(安全证书)端口
server {
listen 80;
server_name www.wodeyumengouwo.com;
rewrite ^(.*) https://$server_name redirect;
#return 302 https://$server_name$request_uri;
}
rewrite做伪静态
## wordpress的伪静态重新规则如下:
if ( -f $request_filename/index.html ){
rewrite (.*) $1/index.html break;
}
if ( -f $request_filename/index.php ){
rewrite (.*) $1/index.php;
}
if ( !-f $request_filename ){
rewrite (.*) /index.php;
}
# 将以上内容加入到 /etc/nginx/conf.d/wp.conf 文件中 location / []里 并打开网站后台
Comments | NOTHING