1.重定向流程图

wechat_2025-09-24_145007_566.png
2.重定向实现的几种方法
2.1 return指令
return指令是nginx中简洁高效的重定向方式,支持直接返回状态码和目标url,性能最优。
# 基本301重定向例子
server {
listen 80;
server_name old-domain.com;
return 301 https://new-domain.com$request_uri; # $request_uri保留完整请求路径
}
# 带条件的302重定向
server {
listen 80;
server_name example.com;
location /maintenance/ {
return 302 /under-maintenance.html; # 临时重定向到维护页面
}
}
注:uri仅包含路径部分。在永久重定向中建议使用$request_uri以保留完整请求信息。
2.2 rewrite模块
rewrite指令,强大的正则表达式,重定向通过正则表达式匹配URL,支持更复杂的重定向逻辑,由ngx_http_rewrite_module模块提供核心支持。
# 目录结构调整重定向
server {
listen 80;
server_name blog.example.com;
# 将/posts/2025/调整为/articles/2025/
rewrite ^/posts/(\d{4})/(.*)$ /articles/$1/$2 permanent; # permanent等效于301
# 临时重定向示例
rewrite ^/temp/(.*)$ /$1 redirect; # redirect等效于302
}
rewrite指令语法解析:
rewrite regex replacement [flag];
常用flag参数:
last:完成当前rewrite后停止处理后续规则
break:立即停止处理后续规则
redirect:返回302临时重定向
permanent:返回301永久重定向
2.3if条件判断
场景化重定向控制,通过if指令可以根据请求特征动态应用重定向规则,实现更精细化的控制逻辑。
server {
listen 80;
server_name example.com;
# 根据浏览器类型重定向
if ($http_user_agent ~* "MSIE [6-8]") {
return 302 /ie-upgrade.html; # 引导旧IE用户升级
}
# 根据请求参数重定向
if ($arg_debug = "true") {
rewrite ^ /debug/$request_uri break; # 调试模式重定向
}
}
注:过度使用if指令可能影响Nginx性能,复杂条件判断建议通过map指令或Lua模块实现。
2.4状态码重定向
通过error_page指令可以将特定状态码的响应重定向到指定页面,提升用户体验。
server {
listen 80;
server_name example.com;
# 404页面重定向
error_page 404 =301 https://example.com/not-found;
# 403页面临时重定向
error_page 403 =302 https://example.com/access-denied;
}