[toc]
Rewrite基本概述
什么是Rewrite
Rewrite主要实现url地址重写,以及重定向,就是把传入web的请求重定向到其他url的过程。
Rewrite使用场景
- 地址跳转
- 协议跳转
- 用户通过http协议请求网站时,将其重新跳转至https协议方式
 
- 伪静态
- 将动态页面显示为静态页面方式的一种技术,便于搜索引擎的录入,同时建上动态URL地址对外暴露过多的参数,提升更高的安全性。
 
- 搜索引擎
- SEO优化依赖于url路径,好记的url便于智齿搜索引擎录入
 
Rewrite配置语法及解析
| 12
 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区别
| 12
 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区别
| 12
 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日志
| 12
 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)
| 12
 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)
| 12
 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)
| 12
 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)
| 12
 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伪静态
| 12
 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)
| 12
 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
 
 | 




