nginx跳转案例详解
一、跳转状态
nginx的跳转状态有两种,301重定向是永久的重定向,搜索引擎会抓取新的内容的同时将旧的地址替换为重定向后的网址;302重定向是暂时的重定向,搜索引擎会抓取新的内容而保留旧的地址。因为服务器返回302,所以搜索引擎会认为新的网址是暂时的。
二、跳转状态的写法
return指令在301跳转上比rewrite指令性能上更加有优势。虽然在访问量不大的情况下几种写法的性能表现上区别并不大,不过在海量访问中一个小小的优化也能在提升业务系统性能上起到不小的作用
301跳转的两种写法:
rewrite ^(.*) https://www.test.com$1 permanent;
rewrite ^(.*)$ $host$1 permanent;
rewrite ^ https://www.test.com$request_uri? permanent;
return 301 $scheme://www.test.com$request_uri;
return 301 https://www.test.com$request_uri;
302跳转的两种写法:
rewrite ^(.*) https://www.test.com$1 redirect;
rewrite ^(.*)$ $host$1 redirect;
rewrite ^ https://www.test.com$request_uri? redirect;
return 302 $scheme://www.test.com$request_uri;
return 302 https://www.test.com$request_uri;
三、匹配规则
正则表达式匹配,其中:
-
~ 为区分大小写匹配
-
~* 为不区分大小写匹配
-
!和!*分别为区分大小写不匹配及不区分大小写不匹配
文件及目录匹配,其中:
-
-f和!-f用来判断是否存在文件
-
-d和!-d用来判断是否存在目录
-
-e和!-e用来判断是否存在文件或目录
-
-x和!-x用来判断文件是否可执行
flag标记有:
-
last 相当于Apache里的[L]标记,表示完成rewrite
-
break 终止匹配, 不再匹配后面的规则
-
redirect 返回302临时重定向 地址栏会显示跳转后的地址
-
permanent 返回301永久重定向 地址栏会显示跳转后的地址
四、跳转实例
1、访问www.a.com域名全部跳转到www.b.com
server_name www.a.com;
rewrite ^/(.*)$ $scheme://www.b.com/$1 permanent;
2、主域名跳转www
server_name a.com www.a.com;
return 301 $scheme://www.a.com$request_uri;
3、主目录跳转,子目录不跳转,a.com和www.a.com都跳到www.b.com,而www.a.com/123不跳
server {
listen 80;
server_name a.com www.a.com;
#根目录跳转
location / {
rewrite .+ http://www.b.com/ permanent;
}
#非根目录本地执行
location ~* /.+ {
#已省略余下通用配置内容
}
}
4、如果页面或目录不存在将直接跳转至网站首页
location / {
root /usr/share/nginx/html/;
index index.html index.htm;
if (!-e $request_filename) {
return 301 $scheme://$host;
break;
}
}
5、所有页面跳转指定页面
(1)对于静态页面
if ($request_uri !~* "^/test/$") {
rewrite ^(.*) https://www.a.com/repair/ permanent;
}
(2)对于非静态页面(含有css和图片等非链接地址)
set $flag 0;
if ($request_uri !~* "\.(jpg|jpeg|png|gif|ico|css|js|gz)$") {
set $flag "${flag}1";
}
if ($request_uri !~* "repair") {
set $flag "${flag}2";
}
if ($flag = "012") {
rewrite ^/(.*) /test/index.html permanent;
}
6、www.a.com/test/123.html 跳转为 test/?cd=123
rewrite "/test/(.*).html$" /test/?cd=$1 last;
7、www.a.com/test/ 下跳转为www.a.com/test/index.php?s=
if (!-e $request_filename){
rewrite ^/admin/(.*)$ /admin/index.php?s=/$1 last;
}
8、在后面添加/index.php?s=
if (!-e $request_filename){
rewrite ^/(.*)$ /index.php?s=/$1 last;
}
9、www.a.com/test/123.html 等test下面数字+html的链接跳转为404
rewrite ^/test/([0-9]+)\.html$ /404.html last;
10、nginx 强制跳转https
if ($server_port = 80){
return 301 https://$server_name$request_uri;}
或者
if ($scheme = http){
return 301 https://$server_name$request_uri;
}
五、实例配置
1、文件服务器配置
location / {
root /data/software/;
index _;
autoindex on; # 开启目录文件列表
autoindex_exact_size on; # 显示出文件的确切大小,单位是bytes
autoindex_localtime on; # 显示的文件时间为文件的服务器时间
charset utf-8,gbk; # 避免中文乱码
}