![带有花括号和引号的 nginx 位置正则表达式不起作用](https://linux22.com/image/1541315/%E5%B8%A6%E6%9C%89%E8%8A%B1%E6%8B%AC%E5%8F%B7%E5%92%8C%E5%BC%95%E5%8F%B7%E7%9A%84%20nginx%20%E4%BD%8D%E7%BD%AE%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
我有一个在 nginx 上运行的网站。我需要重写这样的 URL:
domain.com/blabla/88-aaa-aaaaa-aaaa/qqqq-qqq11-2qq-qqq.html
对此
domain.com/blabla/aaa-aaaaa-aaaa/qqqq-qqq11-2qq-qqq
它的意思是 - 删除斜杠后的数字,然后是破折号,然后是“ .html”扩展名。
为了实现这一点,我尝试使用
location ~* \/[0-9]{1,4}(-.*)(\.html)$ {
......
}
但在位置测试器中,它完全忽略了破折号,并匹配.../88aaa...
,我想避免这种情况。然后我读到,如果表达式包含花括号,则必须在表达式周围使用单引号或双引号。所以我尝试了这个
location ~* "\/[0-9]{1,4}(-.*)(\.html)$" {
......
}
还是没运气……加上引号后,两种情况下都无法匹配位置。有人能帮忙吗?
答案1
我最终针对这个包含花括号的位置问题使用的解决方案是避免使用花括号,并对每个可能的组合重复位置块。这意味着
location ~* /[0-9](-.*)(\.html)$ {
对于.../8-....html
location ~* /[0-9][0-9](-.*)(\.html)$ {
对于.../88-....html
location ~* /[0-9][0-9][0-9](-.*)(\.html)$ {
对于.../888-....html 等等
答案2
你可以用+
“至少其中之一”来简化它
location ~* /[0-9]+(-.*)(\.html)$ {