1.11Nginx Rewrite规则详解
- 前言
- (1) Nginx Rewrite 结尾标识符,用于 Rewrite 规则末尾,表示规则的执行属性。
- (2) Nginx Rewrite 规则常用表达式,主要用于匹配参数、字符串及过滤设置。
- (3) Nginx Rewrite 变量,常用于匹配 HTTP 请求头信息、浏览器主机名、URL 等。
- (4) Nginx Rewrite 以下配置均配置在 nginx.conf 或者 vhosts.conf 中,企业中常用的 Nginx Rewrite 案例如下:
- 1. 将 jfedu.net 跳转至 www.jfedu.net。
- 2.访问 www.jfedu.net 跳转 www.test.com/new.index.html。
- 3.访问/jfedu/test01/跳转至/newindex.html,浏览器地址不变。
- 4.多域名跳转到 www.jfedu.net。
- 5. 访问文件和目录不存在跳转至 index.php。
- 6. 目录对换 /xxxx/123456 ====> /xxxx?id=123456。
- 7. 判断浏览器 User Agent 跳转。
- 8. 禁止访问以.sh,.flv,.mp3 为文件后缀名的文件。
- 9. 将移动用户访问跳转至移动端。
- 10. 匹配 URL 访问字符串跳转。
- 11. 访问/10690/jfedu/123 跳转至/index.php?tid/10690/items=123,[0-9]表示任意一个数字,+表示多个,(.+)表示任何多个字符。
前言
Rewirte 规则也称为规则重写,主要功能是实现浏览器访问 HTTP URL 的跳转,其正 则表达式是基于 Perl 语言。通常而言,几乎所有的 WEB 服务器均可以支持 URL 重写。 Rewrite URL 规则重写的用途:
❑ 对搜索引擎优化(Search Engine Optimization,SEO)友好,利于搜索引擎抓取网站页面;
❑ 隐藏网站 URL 真实地址,浏览器显示更加美观;
❑ 网站变更升级,可以基于 Rewrite 临时重定向到其他页面。
Nginx Rewrite 规则使用中有三个概念需要理解,分别是:Rewrite 结尾标识符、Rewrite 规则常用表达式、Nginx Rewrite 变量,如下为三个概念的详解:
(1) Nginx Rewrite 结尾标识符,用于 Rewrite 规则末尾,表示规则的执行属性。
last :相当于 Apache 里的(L)标记,表示完成 rewrite 匹配; break:本条规则匹配完成后,终止匹配,不再匹配后面的规则。
redirect:返回 302 临时重定向,浏览器地址会显示跳转后的 URL 地址。
permanent:返回 301 永久重定向,浏览器地址栏会显示跳转后的 URL 地址。 其中 last 和 break 用来实现 URL 重写时,浏览器地址栏 URL 地址不变。
(2) Nginx Rewrite 规则常用表达式,主要用于匹配参数、字符串及过滤设置。
. 匹配任何单字符;
[word] 匹配字符串:word;
[^word] 不匹配字符串:word;
jfedu|jfteach 可选择的字符串:jfedu|jfteach;
? 匹配 0 到 1 个字符;
* 匹配 0 到多个字符;
+ 匹配 1 到多个字符;
^ 字符串开始标志;
$ 字符串结束标志;
\n 转义符标志。
(3) Nginx Rewrite 变量,常用于匹配 HTTP 请求头信息、浏览器主机名、URL 等。
HTTP headers:HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_HOST,
HTTP_ACCEPT;
connection & request: REMOTE_ADDR, QUERY_STRING;
server internals: DOCUMENT_ROOT, SERVER_PORT, SERVER_PROTOCOL;
system stuff: TIME_YEAR, TIME_MON, TIME_DAY。 详解如下:
HTTP_USER_AGENT 用户使用的代理,例如浏览器;
HTTP_REFERER 告知服务器,从哪个页面来访问的; HTTP_COOKIE 客户端缓存,主要用于存储用户名和密码等信息; HTTP_HOST 匹配服务器 ServerName 域名;
HTTP_ACCEPT 客户端的浏览器支持的 MIME 类型;
REMOTE_ADDR 客户端的 IP 地址 QUERY_STRING URL 中访问的字符串; DOCUMENT_ROOT 服务器发布目录; SERVER_PORT 服务器端口; SERVER_PROTOCOL 服务器端协议;
TIME_YEAR 年;
TIME_MON 月;
TIME_DAY 日;
(4) Nginx Rewrite 以下配置均配置在 nginx.conf 或者 vhosts.conf 中,企业中常用的 Nginx Rewrite 案例如下:
1. 将 jfedu.net 跳转至 www.jfedu.net。
if ($host = 'jfedu.net' ) {
rewrite ^/(.*)$ http://www.jfedu.net/$1 permanent;
}
2.访问 www.jfedu.net 跳转 www.test.com/new.index.html。
rewrite ^/$ http://www.test.com/index01.html permanent;
3.访问/jfedu/test01/跳转至/newindex.html,浏览器地址不变。
rewrite ^/jfedu/test01/$ /newindex.html last;
4.多域名跳转到 www.jfedu.net。
if ($host != ‘www.jfedu.net’ ) {
rewrite ^/(.*)$ http://www.jfedu.net/$1 permanent;
}
5. 访问文件和目录不存在跳转至 index.php。
if ( !-e $request_filename )
{
rewrite ^/(.*)$ /index.php last;
}
6. 目录对换 /xxxx/123456 ====> /xxxx?id=123456。
rewrite ^/(.+)/(\d+) /$1?id=$2 last;
7. 判断浏览器 User Agent 跳转。
if( $http_user_agent ~ MSIE)
{
rewrite ^(.*)$ /ie/$1 break;
}
8. 禁止访问以.sh,.flv,.mp3 为文件后缀名的文件。
location ~ .*\.(sh|flv|mp3)$
{
return 403;
}
9. 将移动用户访问跳转至移动端。
if ( $http_user_agent ~* "(Android)|(iPhone)|(Mobile)|(WAP)|(UCWEB)" )
{
rewrite ^/$ http://m.jfedu.net/ permanent;
}
10. 匹配 URL 访问字符串跳转。
if ($args ~* tid=13){
return 404;
}
11. 访问/10690/jfedu/123 跳转至/index.php?tid/10690/items=123,[0-9]表示任意一个数字,+表示多个,(.+)表示任何多个字符。
rewrite ^/([0-9]+)/jfedu/(.+)$ /index.php?tid/$1/items=$2 last;