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;
}
}