[toc]
Rewrite基本概述
什么是Rewrite
Rewrite主要实现url地址重写,以及重定向,就是把传入web的请求重定向到其他url的过程。
Rewrite使用场景
- 地址跳转
- 协议跳转
- 用户通过http协议请求网站时,将其重新跳转至https协议方式
- 伪静态
- 将动态页面显示为静态页面方式的一种技术,便于搜索引擎的录入,同时建上动态URL地址对外暴露过多的参数,提升更高的安全性。
- 搜索引擎
- SEO优化依赖于url路径,好记的url便于智齿搜索引擎录入
Rewrite配置语法及解析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| 语法:Syntax: rewrite regex replacement [flag]
rewrite regex replacement flag
rewrite blog.xxx.com www.baidu.com; rewrite http://blog.xxx.com https://www.baidu.com
默认:Default: -- 语境:Context: server,location,if
^ 以什么什么开头 . 匹配任意字符 * 匹配一次或者多次 $ 以什么什么结尾 () 可以后向引用
|
Rewrite标记Flag
rewrite指令根据表达式来重定向URL,或者修改字符串,可以应用于server,location,if环境下,每行rewrite指令最后跟一个flag标记,支持的flag标记有如下表格所示:
flag |
作用 |
last |
本条规则匹配完成后,继续匹配后面的规则 |
break |
本条规则匹配完成后,停止匹配后面的规则 |
redirect |
返回302临时重定向,地址栏会显示跳转后的地址 |
permanent |
返回301永久重定向,地址栏会显示跳转后的地址 |
last与break区别对比示例
配置rewrite体现last与break区别
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| vim /etc/nginx/conf.d/rewrite.conf
server { listen 80; server_name rewrite.drz.com; root /code; location ~ ^/break { rewrite ^/break /test/ break; } location ~ ^/last { rewrite ^/last /test/ last; } location /test/ { default_type application/json; return 200 "ok"; } }
nginx -t
nginx -s reload
|


last与break区别
break匹配到规则,会去本地配置路径的目录中寻找请求的文件;
last匹配到规则,会对其所在的server(…)标签重新发起请求。
- break请求:
- 请求rewrite.drz.com/break
- 首先会去查找本地的/code/test/index.html;
- 如果找到了,则返回/code/test/index.html的内容;
- 如果没找到该目录则报错404,如果找到该目录没找到对应的文件则403
- last请求:
- 请求rewrite.drz.com/last
- 首先会去查找本地的/code/test/index.html;
- 如果找到了,则返回/code/test/index.html的内容;
- 如果没找到,会对当前server重新的发起一次请求,rewrite.drz.com/test/
- 如果有location匹配上,则直接返回该location的内容。
- 如果也没有location匹配,再返回404;
所以,在访问/break和/last请求时,虽然对应的请求目录/test都是不存在的,理论上都应该返回404,但是实际上请求/last的时候,是会有后面location所匹配到的结果返回的,原因在于此。
redirect与permanent区别对比示例
配置rewrite体现redirect与permanent区别
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| vim /etc/nginx/conf.d/rewrite.conf
server { listen 80; server_name rewrite.cl.com; root /code; location /test { rewrite ^(.*)$ https://www.chenlin.cloud redirect; } }
nginx -t
nginx -s reload
|
redirect与permanent区别
- redirect
- 每次请求都会询问服务器,如果当服务器不可用时,则会跳转失败。
- permanent
- 第一次请求会询问,浏览器会记录跳转的地址,第二次则不再询问服务器,直接通过浏览器缓存的地址跳转。 Rewrite规则实践
打开Rewrite日志
1 2 3 4 5 6 7 8 9 10 11 12 13
|
vim /etc/nginx/nginx.conf
error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;
events { worker_connections 1024; }
http { rewrite_log on;
|
实操案例
案例一(用户访问/abc/1.html,实际访问的是/ccc/bbb/2.html)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| server{ listen 80; server_name rewrite.xxx.com; root /code; index index.html;
location /abc/1.html{ rewrite ^(.*)$ /ccc/bbb/2.html redirect; } }
rewrite.xxx.com/abc/1.html ---------> /ccc/bbb/2.html
|
案例二(用户访问/2018/ccc/2.html 实际实在访问/2014/ccc/bbb/2.html)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
server{ listen 80; server_name rewrite.xxx.com; root /code; index index.html;
location /2018/ccc{ rewrite ^(.*)$ /2014/ccc/bbb/2.html redirect; } }
rewrite.xxx.com/2018/ccc/2.html ---------> /2014/ccc/bbb/3.html
server{ listen 80; server_name rewrite.xxx.com; root /code; index index.html;
location /2018{ rewrite ^/2018/(.*)$ /2014/$1 redirect; } }
rewrite.xxx.com/2018/ccc/bbb/3.html -------------> /2014/ccc/bbb/3.html
|
案例三(用户访问course-11-22-33.html实际在访问/course/11/22/33/course.33.html)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| server{ listen 80; server_name rewrite.xxx.com; root /code; index index.html;
location / { rewrite course-(.*)-(.*)-(.*).html /course/11/22/33/course.33.html redirect; } }
rewrite.xxx.com/course-11-22-33.html -------------> /course/11/22/33/course.33.html
|
案例四(80端口强制跳转443)
1 2 3 4 5 6 7 8 9 10 11 12
| server{ listen 80; server_name rewrite.xxx.com; rewrite ^(.*)$ https://$server_name redirect; }
http://rewrite.xxx.com/ -------------> https://rewrite.xxx.com/
http端口:80 https端口:443
|
Rewrite伪静态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| 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; }
server { listen 80; server_name blog.xxx.com; root /code/wordpress; index index.php index.html;
location / { 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; } }
location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include /etc/nginx/fastcgi_params; } }
|
示例:Rewrite场景实操(web01)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
| vim /etc/yum.repos.d/nginx.repo
[nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true
yum -y install nginx
yum -y localinstall *.rpm
vim /etc/nginx/conf.d/discuz.xxx.com.conf
server { listen 80; server_name discuz.xxx.com; location / { root /code/discuz/upload; index index.php index.html; } location ~ \.php$ { root /code/discuz/upload; fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
mkdir -p /code/discuz
wget http://test.driverzeng.com/Nginx_Code/Discuz_X3.3_SC_GBK.zip
unzip Discuz_X3.3_SC_GBK.zip -d /code/discuz/
groupadd www -g 666 && useradd www -u 666 -g 666 -s /sbin/nologin -M
vim /etc/nginx/nginx.conf vim /etc/php-fpm.d/www.conf
chown -R www.www /code/
systemctl restart nginx systemctl restart php-fpm
yum -y install mariadb-server
systemctl start mariadb
mysqladmin -u root password '123'
mysql -uroot -p123
create database discuz charset utf8;
grant all on discuz.* to discuz@'%' identified by '123';
show databases;
10.0.0.7 discuz.xxx.com
discuz.xxx.com
|




