[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 # 你要替换的url
flag
## 示例:
rewrite blog.xxx.com www.baidu.com;
rewrite http://blog.xxx.com https://www.baidu.com # 被替换的url 替换成的url

默认:Default: --
语境:Context: server,location,if

#用于切换维护页面场景
#rewrite ^(.*)$ /page/maintain.html break $1;
## 语法解析:^(.*)$
^ 以什么什么开头
. 匹配任意字符
* 匹配一次或者多次
$ 以什么什么结尾
() 可以后向引用

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
# 编辑rewrite配置文件
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服务
nginx -t

# 重载nginx配置文件
nginx -s reload

image-20230110154829104

image-20230110154841863

last与break区别

break匹配到规则,会去本地配置路径的目录中寻找请求的文件;
last匹配到规则,会对其所在的server(…)标签重新发起请求。

  • break请求:
    1. 请求rewrite.drz.com/break
    2. 首先会去查找本地的/code/test/index.html;
    3. 如果找到了,则返回/code/test/index.html的内容;
    4. 如果没找到该目录则报错404,如果找到该目录没找到对应的文件则403
  • last请求:
    1. 请求rewrite.drz.com/last
    2. 首先会去查找本地的/code/test/index.html;
    3. 如果找到了,则返回/code/test/index.html的内容;
    4. 如果没找到,会对当前server重新的发起一次请求,rewrite.drz.com/test/
    5. 如果有location匹配上,则直接返回该location的内容。
    6. 如果也没有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
# 编辑rewrite配置文件
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;
#rewrite ^(.*)$ https://www.chenlin.cloud permanent;
#return 301 https://www.chenlin.cloud;
#return 302 https://www.chenlin.cloud;
}
}

# 检查nginx服务
nginx -t

# 重载nginx配置文件
nginx -s reload

redirect与permanent区别

  • redirect
    • 每次请求都会询问服务器,如果当服务器不可用时,则会跳转失败。
  • permanent
    • 第一次请求会询问,浏览器会记录跳转的地址,第二次则不再询问服务器,直接通过浏览器缓存的地址跳转。 Rewrite规则实践

打开Rewrite日志

1
2
3
4
5
6
7
8
9
10
11
12
13
# 打开日志
## 错误日志的级别改成notice 在http层加上rewrite_log on
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
# 编辑rewrite配置文件
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
# 解决方案一
# 编辑rewrite配置文件
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

# 解决方案二
# 编辑rewrite配置文件
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
# 编辑rewrite配置文件
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 course-(.*)-(.*)-(.*).html /course/$1/$2/$3/course.33.html redirect;
#rewrite course-11-22-33.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
# 编辑rewrite配置文件
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

# 安装nginx
yum -y install nginx

# 安装php
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

# 下载discuz文件代码
wget http://test.driverzeng.com/Nginx_Code/Discuz_X3.3_SC_GBK.zip

# 解压到/code/discuz下
unzip Discuz_X3.3_SC_GBK.zip -d /code/discuz/

# 创建www用户
groupadd www -g 666 && useradd www -u 666 -g 666 -s /sbin/nologin -M

# 修改nginx&php配置文件
vim /etc/nginx/nginx.conf
vim /etc/php-fpm.d/www.conf

# 授权站点目录
chown -R www.www /code/

# 重启nginx&php服务
systemctl restart nginx
systemctl restart php-fpm

# 下载mysql数据库服务
yum -y install mariadb-server

# 启动mariadb服务
systemctl start mariadb

# 创建账户密码
mysqladmin -u root password '123'

# 登录mysql
mysql -uroot -p123

# 创建discuz数据库
create database discuz charset utf8;

# 创建discuz的账户密码
grant all on discuz.* to discuz@'%' identified by '123';

# 查看库
show databases;

# 域名解析
10.0.0.7 discuz.xxx.com

# 访问网址
discuz.xxx.com

image-20230110173143915

image-20230110173148528

image-20230110173152063

image-20230110173155818

image-20230110173200736