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永久重定向 地址栏会显示跳转后的地址
server_name www.a.com;
rewrite ^/(.*)$ $scheme://www.b.com/$1 permanent;
server_name a.com www.a.com;
return 301 $scheme://www.a.com$request_uri;
server {
listen 80;
server_name a.com www.a.com;
#根目录跳转
location / {
rewrite .+ http://www.b.com/ permanent;
}
#非根目录本地执行
location ~* /.+ {
#已省略余下通用配置内容
}
}
location / {
root /usr/share/nginx/html/;
index index.html index.htm;
if (!-e $request_filename) {
return 301 $scheme://$host;
break;
}
}
(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;
}
rewrite "/test/(.*).html$" /test/?cd=$1 last;
if (!-e $request_filename){
rewrite ^/admin/(.*)$ /admin/index.php?s=/$1 last;
}
if (!-e $request_filename){
rewrite ^/(.*)$ /index.php?s=/$1 last;
}
rewrite ^/test/([0-9]+)\.html$ /404.html last;
原文:https://www.cnblogs.com/wzxmt/p/12524116.html