Nginx 重定向规则

Nginx 重定向规则

我正在尝试重定向

  • 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 结构。

相关内容