nginx “return 301” 和 ”try_files“ 为何会陷入无限循环

nginx “return 301” 和 ”try_files“ 为何会陷入无限循环

我的配置代码:

index index.html index.php;
location / {
    if ($uri = '/a/') {
        return 301 https://example.com/a;
    }
    try_files $uri $uri/ =404; 
}

如果url为/a/,301到/a,则try_files部分,添加//a结尾,变成/a/

下一步,我认为它会尝试index定义,成为/a/index.html,并到达文件。

但实际上,它尝试了/a/,并跳出了location,然后再次进入location,到if ($uri = '/a/') { ... }

然后无限循环。

为什么,我只是感到困惑。


我想做的是

  1. 如果请求example.com/a/,跳转到example.com/a,然后转到 2
  2. 如果请求example.com/a,则显示example.com/a/index.html(但 url 是example.com/a)。

有人能帮助我实现这个目标吗?

答案1

它正在做它应该做的事。

您永远无法到达,/a/index.html因为在发生这种情况之前,您不断重定向回/a。当 nginx 处理此问题时,它会在文件系统上看到目录并自动(正确地)重定向到/a/

您应该删除这个不适当的重定向。

答案2

欢迎来到 ServerFault。您可以使用以下代码执行 OP 中提到的操作...

location / {
    if ($uri = '/a/') {
        return 301 https://example.com/a;
    }
    try_files $uri $uri/index.html =404; 
}

请参阅相关问题和接受的答案使用 nginx 删除 URL 末尾的斜杠

基本上,我们不需要依赖index,而是在需要index.html时直接提供服务。example.com/a

相关内容