我正在尝试重定向
https://example.com/1001/def.txt
->https://example.com/1001/1/def.txt
https://example.com/1001/*
->https://example.com/1001/1/*
location /2023/ {
if ($request_uri ~* "/2023/(.*)") {
return 302 /1/$2 break;
}
}
我面临的问题是,每当我尝试匹配路径并将其重定向到也包含在内/1001/
目标路径时,请求就会陷入无限循环。1001
/1001/1/
答案1
为了防止无限循环,您需要使用仅匹配原始 URL 而不匹配重写的 URL 的重写条件。您可以使用以下命令实现所需的重定向nginx配置:
server {
listen 80;
server_name example.com;
location /1001/ {
if ($request_uri !~ "^/1001/1/") {
rewrite ^/1001/(.*)$ /1001/1/$1 permanent;
}
# Your other server configuration
}
}
此配置使用 if 指令添加 URL 不应包含的条件/1001/1/。 这改写然后使用指令将请求重定向到/1001/到/1001/1/。 这1 美元目标 URL 中捕获与(.*)模式。永恒的标志表示这应该是一个永久重定向。
答案2
您可以尝试以下设置:
location ~ ^/1001/[1-9]/ {
# block configuration
}
location ~ ^/1001/(.*) {
return 302 /1001/1/$1;
}
块的顺序location
很重要:nginx 使用第一个匹配的正则表达式位置来处理请求。您可以调整第一个location
块中的正则表达式,以更准确地匹配所需的目标 URL 结构。