如何在 nginx 中创建一个可以使用 AND 且不带尾部斜杠的位置?

如何在 nginx 中创建一个可以使用 AND 且不带尾部斜杠的位置?

现在我有这个配置:

location ~ ^/phpmyadmin/(.*)$
{
        alias /home/phpmyadmin/$1;
}

但是,如果我访问www.mysite.com/phpmyadmin(请注意,没有尾部斜杠),它不会找到我正在寻找的 404。我猜是因为我没有添加尾部斜杠。我该如何解决这个问题?

答案1

它可能存在于你使用的正则表达式中——

location ~ ^/phpmyadmin/(.*)$

以上内容将匹配 /phpmyadmin/、/phpmyadmin/anything/else/here,但不会匹配 /phpmyadmin,因为正则表达式包含尾随斜杠。

你可能想要这样的东西:

location ~ /phpmyadmin/?(.*)$ {
    alias /home/phpmyadmin/$1;
}

问号是一个正则表达式量词,应该告诉 nginx 匹配零个或一个前一个字符(斜线)。

警告:社区认为这个解决方案可能存在安全风险

答案2

更好的解决方案:

location ~ ^/phpmyadmin(?:/(.*))?$ {
    alias /home/phpmyadmin/$1;
}

首先确保服务器有权限/home/phpmyadmin


与接受的答案的差异解释:

这全都是关于常用表达

首先,^char 表示要从字符串的开头匹配,而不是从中间某处匹配。at $the end 表示匹配到字符串的末尾。

意思(?:)是非捕获组 - 我们不希望它出现在捕获结果中,但我们想简单地对一些字符进行分组。我们这样分组,是因为我们希望字符/成为子路径的非重要部分,而不是父路径的重要部分。

答案3

为什么你不直接使用

location /phpmyadmin {
    alias /home/phpmyadmin;
}

答案4

此重定向将仅有的重写带有或不带有尾部斜杠的 URL。斜杠后面的任何内容都不会被覆盖。

domain.com/location => 重定向至 domain.com/new/location
domain.com/location => 重定向至 domain.com/new/location
domain.com/location/other => 未重定向

server {
  # 301 URL Redirect
  rewrite ^/location/?$ /new/location permanent;
}

相关内容