Nginx的跳转配置主要依赖两条指令:return和rewrite。其中return用于直接返回状态码并指定Location头,执行效率高,适合简单跳转;rewrite则基于正则表达式改写URI,灵活性更强,但会消耗更多CPU资源。对于搜索引擎优化来说,301状态码表示资源永久移动,旧链接的权重会传递到新地址;如果错误地使用了302临时跳转,搜索引擎可能继续索引旧地址,影响站点权重。因此,在域名更换、HTTP升级HTTPS、URL结构优化等场景下,正确设置301跳转非常关键。

一、return指令与rewrite指令的核心差异
return指令的使用方式很直接,可以在server或location上下文中配置。它的语法是 return 状态码 [文本或URL],当Nginx匹配到该规则后立即返回,不再执行后续指令。例如要把旧域名old.ipipp.com的所有请求跳转到新域名,只需写:
server { listen 80; server_name old.ipipp.com; return 301 http://www.ipipp.com$request_uri; }这段配置的意义是,任何访问old.ipipp.com的请求都会返回301并携带新的URL,同时保留原请求的路径和查询参数,避免出现跳转后直接回到首页的问题。
rewrite指令则更灵活,它按照正则表达式匹配原始URI,并将其替换为新的URI,再根据标记决定后续行为。常用的标记有last、break、redirect和permanent。其中permanent对应301,redirect对应302。rewrite适合处理路径规则性变化的场景,比如把旧栏目/old/下的所有文章映射到/new/目录下。但注意rewrite会消耗正则匹配性能,大量规则时应优先考虑return。
二、常见跳转场景及配置实例
场景一:HTTP强制跳转HTTPS。这是目前最普遍的配置,用于提升安全性。通常会在监听80端口的server块里直接返回301到https地址,示例如下:
server { listen 80; server_name ipipp.com www.ipipp.com; return 301 https://www.ipipp.com$request_uri; }这样所有明文HTTP请求会被浏览器或客户端重定向到HTTPS版本,并且保留原始路径。如果希望同时去掉www前缀,可以先把域名统一到带www的形式,或者反过来,根据站点策略调整。
场景二:不带www跳转到带www。很多网站希望规范域名形式,通常把ipipp.com跳转到www.ipipp.com。配置如下:
server { listen 80; server_name ipipp.com; return 301 http://www.ipipp.com$request_uri; }这里只监听不带www的域名,当用户输入ipipp.com时返回301,指向带www的地址。同时需要确保www.ipipp.com这个server块存在且能正常处理请求,否则会导致跳转后无法访问。
场景三:目录末尾斜杠补充。某些静态资源目录如果缺少末尾斜杠,Nginx默认会尝试查找文件,失败后可能返回404。可以通过rewrite给目录路径自动补全斜杠:
server { listen 80; server_name ipipp.com; rewrite ^/download$ /download/ permanent; }这个规则只对/download路径生效,用户访问/ipipp.com/download时会301跳转到/download/,从而避免相对路径资源加载错乱的问题。
三、配置生效、测试与常见问题
修改Nginx配置文件后,不要直接重启服务,而是先执行 nginx -t 检查语法是否正确。如果没有错误,再执行 nginx -s reload 平滑重载配置。否则一旦配置文件有语法错误,可能导致整个服务中断。
测试跳转是否生效最快捷的方式是使用curl命令:curl -I http://old.ipipp.com 会返回HTTP响应头,其中可以查看状态码是否为301以及Location字段是否指向目标地址。注意如果之前用浏览器打开过旧地址,浏览器可能会缓存301结果,导致后续修改配置后仍然看到旧的跳转行为。此时可以换用无痕窗口或清空缓存,或者使用curl加 -H "Cache-Control: no-cache" 参数。
常见问题一:rewrite标记用错。有些开发者把rewrite的permanent标记写成last或break,结果跳转状态码变成302或根本不跳转。对于需要永久迁移的场景,务必使用permanent或直接使用return 301。
常见问题二:多server块优先级混乱。当多个server块都监听同一个端口时,Nginx会根据server_name匹配,但如果请求的Host头没有匹配任何server_name,会走默认server。此时可能出现跳转规则不生效的情况。建议显式设置default_server,并严格区分域名跳转的server块。
常见问题三:正则表达式过于宽泛。例如使用 rewrite ^/(.*)$ https://www.ipipp.com/$1 permanent; 这样的规则,会导致所有路径都被重写,如果站点内有反向代理或API接口,可能会误伤正常请求。尽量缩小匹配范围,只对需要跳转的路径做正则。
nginx跳转nginx301重定向nginx配置修改时间:2026-09-22 04:21:42