我的配置代码:
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/') { ... }
。
然后无限循环。
为什么,我只是感到困惑。
我想做的是
- 如果请求
example.com/a/
,跳转到example.com/a
,然后转到 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