Nginx跨域名长URL重定向配置异常求助
Nginx跨域名URL重定向问题排查与解决
你的配置存在的核心问题
- server_name字段误用:
server_name只能用来匹配请求的主机域名,不能包含/education/7/abc-science这类URI路径。你把路径写进server_name后,Nginx会将其视为域名的一部分,这就是警告里"suspicious symbols"的来源,也导致请求根本无法被正确匹配。 - return语句冗余追加路径:你的
return指令里加了$request_uri,这会把原请求的完整URI再次追加到新链接末尾,最终生成重复路径的错误URL(比如https://www.test.com/education/7/abc-science/education/7/abc-science)。 - 测试请求拼写错误:你测试时用的路径是
/education/7/abc-scienc(少了最后一个字母e),和目标路径abc-science不一致,这也会导致匹配失效。
正确的实现方式:用location匹配路径
是的,必须通过location块来匹配具体的URI路径,结合server_name匹配旧域名,才能实现正确的跨域名重定向。以下是两种常用方案:
方案1:仅针对单个精确路径重定向
适合只需要重定向这一个特定URL的场景:
server { listen 80; # 由于ALB已完成HTTP转HTTPS,若Nginx部署在ALB后端,可无需配置listen 443,根据实际架构调整 server_name qwerty.test.com; # 精确匹配目标路径,确保拼写完全一致 location = /education/7/abc-science { # 直接将原URI映射到新域名,避免写死路径出错 return 301 https://www.test.com$request_uri; # 也可以直接写死固定路径:return 301 https://www.test.com/education/7/abc-science; } }
方案2:批量重定向旧域名下的所有/education/前缀路径
如果后续还有同前缀的URL需要重定向,可使用前缀匹配:
server { listen 80; server_name qwerty.test.com; # 前缀匹配所有/education/开头的请求 location ^~ /education/ { return 301 https://www.test.com$request_uri; } }
为什么之前测试得到错误结果?
因为你的server_name配置错误,Nginx无法匹配到这个自定义server块,转而使用了默认的server配置,所以重定向回了原地址。
内容的提问来源于stack exchange,提问作者Santosh Baruah
相关产品推荐
相关产品推荐

