Nginx 重写

Rewrite 概述

什么是 Rewrite

改写请求的 URL,将用户请求的 URL 重新定位到一个新的 URL

Rewrite 作用

①.Rewrite 使网站更加安全,隐藏了具体的文件路径和文件名

②.Rewrite 提高了用户体验,如输入老域名,可以跳转到新域名;加过 SSL 证书后,可以从 HTTP 跳转到 HTTPS

③.Rewrite 可以实现 URL 的伪静态,优化 SEO(Search Engine Optimization),动态请求的 URL 也会被搜索引擎收录

如何使用 Rewrite

使用 Rewrete 需要使用 ngx_http_rewrite_module 模块(官方文档)。

Flag Description
redirect 返回 302 临时重定向,浏览器缓存和搜索引擎会记载(收录)原域名,不影响 SEO 权重
permanent 返回 301 永久重定向,浏览器缓存和搜索引擎会记载(收录)跳转后的域名,影响 SEO 权重
break 停止处理当前 location 匹配规则,不再请求,可用于切换维护页面的场景
last 停止处理当前 location 匹配规则,重新请求重写的 URL,寻找匹配的 location
# Rewrite 语法
Syntax:		rewrite regex replacement [flag];
Default:	—
Context:	server, location, if
# Return 语法
Syntax:	return code [text];
return code URL;
return URL;
Default:	—
Context:	server, location, if
# If 语法
Syntax:		if (condition) { ... }
Default:	—
Context:	server, location
# 配置日志
Syntax:		rewrite_log on | off;
Default:	rewrite_log off;
Context:	http, server, location, if


# 配置 Rewrite 日志
[root@web01 ~]# vi /etc/nginx/nginx.conf 
http{
...
    rewrite_log on;
    error_log /var/log/nginx/rewrite_error.log notice;
...
}

# Rewrite 配置,区分 last 和 break
[root@web01 ~]# cat /etc/nginx/conf.d/rewrite.conf 
server {
        listen 80;
        server_name rewrite.wqh.com;
        root /website;

        location ~ ^/break {
                rewrite ^/break /test/ break;
        }
        location ~ ^/last {
                rewrite ^/last /test/ last;
        }
        location /test/ {
                default_type application/json;
                return 200 "ok";
        }
}

Break 与 Last 的区别:
Break 匹配到规则,则会去本地配置路径的目录中寻找请求的文件;
Last 匹配到规则,会重新发起请求匹配符合条件的 server 与 location 规则 。

Break 请求:
1、请求 rewrite.wqh.com/break
2、首先,会去查找本地的 /website/test/index.html;
3、如果找到了,则返回 /website/test/index.html 的内容;-----------------以上为相同点,以下为不同点
4、如果没找到该目录则报错 404,如果找到该目录没找到对应的文件则 403

Last 请求:
1、请求 rewrite.wqh.com/last
2、首先,会去查找本地的 /website/test/index.html;
3、如果找到了,则返回 /website/test/index.html 的内容;-----------------以上为相同点,以下为不同点
4、如果没找到,会对当前 server 重新的发起一次请求,rewrite.wqh.com/test/
5、如果有 location 匹配上,则直接返回该location的内容;
6、如果也没有 location 匹配,再返回 404

所以,在请求匹配了 /break 和 /last 的规则时,都会默认寻找请求目录 /test 是否存在,若不存在,理论上都应该返回 404,
但是实际上请求 /last 的时候,是可以再次匹配 location 得到结果返回的(类似 continue 只是跳出本次循环;last 标记只是跳出本次 location 规则,然后重新发起请求,匹配符合条件的 location 规则)
请求 /break 的时候,不可以再次匹配 location,只会按 URL 路径寻找其目录或索引文件是否存在,所以 /test 目录不存在,就会返回 404(类似 break 跳出整个循环,break 标记不再重新发起请求,也不会匹配符合条件的server 与 location 规则)

Rewite 实现伪静态

安装 Discuz

应用服务器 Nginx 配置:

# 编辑 nginx 子配置文件
[root@web01 ~]# cat /etc/nginx/conf.d/discuz.wqh.com.conf 
server {
	listen 80;
	server_name discuz.wqh.com;
	root /website/discuz/upload;
	index index.php;
	location ~ .php$ {
		fastcgi_pass 127.0.0.1:9000;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		include fastcgi_params;
	}
}

# 下载安装包,部署到站点目录
[root@web01 ~]# cd /website/discuz
[root@web01 discuz]# ll
drwxr-xr-x  2 www www  102 Jul 27  2017 readme
drwxr-xr-x 12 www www 4096 Jul 27  2017 upload
drwxr-xr-x  4 www www   72 Jul 27  2017 utility

# 重启服务,配置 Windows 本地域名解析

数据库服务器 MariaDB 配置:

# 创建一个 discuz 数据库
[root@db01 ~]# mysql -p123
MariaDB [(none)]> create database discuz;
MariaDB [(none)]> grant all on discuz.* to dc_user@'%' identified by '123456';

打开浏览器安装:

伪静态 URL

为了 SEO(Search Engine Optimization,搜索引擎优化),当客户端发起动态请求时,我们需要使用伪静态技术,将请求的 URL 地址去掉参数,修改成 .html 的静态文件 。

如果某个动态请求的 URL是这样的:http://discuz.wqh.com/forum.php?mod=viewthread&tid=1&extra=page%3D1,那么这个页面几乎就不会被搜索引擎收录,因为搜索引擎无法加上 URL 中的参数,如下图:

所以,如果想更容易的被搜索引擎收录,需要将动态请求 URL 伪装成静态请求 URL,进入到 Discuz 后台管理界面,修改 SEO 设置,开启 URL 静态化:

点击右上角 查看当前的 Rewrite 规则,可以看到需要写到 nginx 配置文件中的规则:

# 编写 nginx 子配置文件,将上图中的 Rewrite规则 写到 location /{} 中
[root@web01 conf.d]# cat discuz.wqh.com.conf 
server {
	listen 80;
	server_name discuz.wqh.com;
	root /website/discuz/upload;
	index index.php;

	location / {
	rewrite ^([^.]*)/topic-(.+).html$ $1/portal.php?mod=topic&topic=$2 last;
	rewrite ^([^.]*)/article-([0-9]+)-([0-9]+).html$ $1/portal.php?mod=view&aid=$2&page=$3 last;
	rewrite ^([^.]*)/forum-(w+)-([0-9]+).html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3 last;
	rewrite ^([^.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+).html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last;
	rewrite ^([^.]*)/group-([0-9]+)-([0-9]+).html$ $1/forum.php?mod=group&fid=$2&page=$3 last;
	rewrite ^([^.]*)/space-(username|uid)-(.+).html$ $1/home.php?mod=space&$2=$3 last;
	rewrite ^([^.]*)/blog-([0-9]+)-([0-9]+).html$ $1/home.php?mod=space&uid=$2&do=blog&id=$3 last;
	rewrite ^([^.]*)/(fid|tid)-([0-9]+).html$ $1/archiver/index.php?action=$2&value=$3 last;
	rewrite ^([^.]*)/([a-z]+[a-z0-9_]*)-([a-z0-9_-]+).html$ $1/plugin.php?id=$2:$3 last;
		if (!-e $request_filename) {
			return 404;
		}
	}

	location ~ .php$ {
		fastcgi_pass 127.0.0.1:9000;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		include fastcgi_params;
	}
}

原文地址:https://www.cnblogs.com/zzzwqh/p/13034112.html