Nginx 重定向除文件夹本身之外的所有子文件夹

Nginx 重定向除文件夹本身之外的所有子文件夹

我在安装 Wordpress 时遇到了奇怪的名称冲突,我需要编写一些 Nginx 规则来修复它。

我曾经在 Wordpress 页面中列出我的软件项目/项目,包含子页面链接/项目/项目名称/项目/其他名称, ETC。

最近,我购买了一个带有自定义帖子类型的主题,用于组合项目。它叫做项目(请注意缺失s)。

/项目,我访问了所有默认的Wordpress列表项目帖子。然后,我可以使用/项目/项目名称/项目/其他名称, ETC。

到目前为止一切顺利。问题是我想使用新的 /project 结构来保留任何先前指向我的 /projects/something 的链接。此外,我只想保留 /projects 页面(不重定向)。

这就是我想要实现的。

  1. URL/项目 仅有的应该重定向到/项目,这样我就可以显示一个 Wordpress 页面,而不是“丑陋的”Wordpress 帖子列表。

  2. 因此,URL/项目 仅有的不应进行处理。它应该显示相应的 Wordpress 页面。

  3. 然而,全部表单中的 URL/项目/某事应该重定向到/项目/某事

这是我目前的 nginx 规则。

location ~ ^/projects/(.*) {
   return 301 http://$server_name/project/$1;
}

这对 3. 很有效:/projects/aprojectname -> /project/aprojectname。

它不适用于 2.,因为它将 /projects 重写为/项目

我不知道如何实施1.,因为任何尝试都会影响之前写的规则。

答案1

location ~ ^/projects/(.+) {
    rewrite ^ http://$server_name/project/$1 permanent;
}

使用 .+ 代替 .* 可以解决该问题,因为 .+ 匹配 1 个或多个字符,而 .* 匹配 0 个或多个字符。因此,/projects/ 文件夹不受该规则影响。

对于 1,以下应该有效:

location = /project {
    rewrite ^ http://$server_name/projects permanent;
}

location =是 nginx 的精确匹配指令,因此只有 URI 完全匹配才会匹配/project

我还用 rewrite 指令替换了 return 301 指令,因为这是执行重写的首选方式。

  • 泰罗

相关内容