![nginx 嵌套位置失败](https://linux22.com/image/739068/nginx%20%E5%B5%8C%E5%A5%97%E4%BD%8D%E7%BD%AE%E5%A4%B1%E8%B4%A5.png)
我需要在我的网站上的一组特定 URI 上强制使用尾部斜杠。
URI 采用以下格式:/foo/bar1/bar2/bar3/?abc
,其中/foo/
是所有动态的通用URI,并且它本身也是有效的URI。
假设已执行^(.*[^/])$
前缀检查,则所有且只有动态 URI 才会与正则表达式匹配。/foo/
我的代码目前如下所示:
location /foo/ {
location ~* ^(.*[^/])$ {
return 302 $baseUrl/$1/$is_args$args;
}
}
然而,这会导致所有页面出现 404 错误/foo/.*
,尽管它确实按预期成功插入了斜线。
显然,如果它与外部位置匹配,但与内部位置不匹配,则会失败。
我所寻找的是一个导致执行退出外部位置的语句。
笔记:
我意识到我只能说
location ~* ^(/foo/.*[^/])$ {
return 302 $baseUrl/$1/$is_args$args;
}
但由于正则表达式的性能问题,我想避免使用它。我不想在非候选页面上处理这个问题。
答案1
经过更多的研究和实验,我最终将这个条件移到了最后的
location / {
try files . . .
}
得到类似的东西
location / {
## Enforce trailing slash on dynamic pages
location /foo/ {
location ~* ^(.*[^/])$ {
return 302 $baseUrl/$1/$is_args$args;
}
try_files $uri $uri/ /index.php?$args;
}
try_files $uri $uri/ /index.php?$args;
}
仍然有点混乱,并且有重复的代码,但它可以工作