Nginx配置301重定向:旧子目录及带参地址转网站根目录
Nginx 301重定向保留查询参数的解决方案
你当前的正则location规则仅能处理无参数的地址,核心问题是return 301 /$1不会自动携带原请求的查询参数(即URL中?之后的部分),导致带参数的旧链接跳转后丢失参数,触发404错误。以下是两种可行的解决方案:
方案一:合并匹配/s/和/sc/前缀
通过正则分组同时匹配两个子目录,一次性处理所有跳转,同时完整保留查询参数:
location ~* ^/(s|sc)/(.*) { return 301 $scheme://$host/$2$is_args$args; }
参数说明:
^/(s|sc)/(.*):匹配所有以/s/或/sc/开头的请求路径$scheme:自动获取当前请求的协议(http/https)$host:自动获取当前请求的域名$2:对应正则中第二个捕获组,即/s/或/sc/之后的路径部分$is_args:如果原请求带查询参数则返回?,否则为空$args:完整保留原请求的所有查询参数
方案二:分开配置两个子目录
如果后续需要对/s/和/sc/设置不同规则,可在原有规则基础上添加参数保留逻辑:
location ~* ^/sc/(.*) { return 301 /$1$is_args$args; } location ~* ^/s/(.*) { return 301 /$1$is_args$args; }
注意事项
- 修改配置后需重载Nginx生效:
sudo nginx -s reload - 301为永久重定向,浏览器会缓存跳转规则,测试时建议使用隐私窗口或清除缓存
- 正则中的
(.*)会捕获路径中除换行外的所有字符,兼容带特殊字符的旧链接
内容的提问来源于stack exchange,提问作者Karsten
相关产品推荐
相关产品推荐

