现在我有这个配置:
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;
}