带花括号和引号的nginx位置正则表达式不起作用


1

我有一个网站,在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)$" {
   ......
}

仍然没有运气......使用引号,它无法匹配两种情况下的位置。有人可以帮忙吗?


我不知道nginx,但我确实对正则表达式有所了解。你确定在破折号之前需要反斜杠吗?除了括号内,通常破折号并不特殊。
Scott

1
@Scott好,不是真的:)我以为我必须逃避它。只是在regex测试器中尝试并验证,它是不需要的。谢谢你的提示
j.kaspar

/ 不需要逃脱。试试看: location ~* /[0-9]{1,4}(-.*\.html)$ {
Toto

@Toto谢谢。我需要在斜线后立即匹配数字,这就是为什么我把它抄去了。无论如何,我尝试了你的建议,但不幸的是,这种行为仍然是一样的
j.kaspar

1
nginx 在第一次尝试时没有重新启动(没有引号) - 它仍将运行先前的配置。第二次尝试(带引号,有或没有虚假的反斜线)对我有用。里面发生了什么 location 块?
Richard Smith

Answers:


0

我最终用于包含花括号的位置的这个特定问题的解决方案是避免它们,并为每个可能的组合重复位置块。这意味着

location ~* /[0-9](-.*)(\.html)$ {

对于... / 8 -.... html

location ~* /[0-9][0-9](-.*)(\.html)$ {

对于... / 88 -.... html

location ~* /[0-9][0-9][0-9](-.*)(\.html)$ {

对于... / 888 -..html等


0

您可以使用它来简化它 + 这意味着“至少有一个”

location ~* /[0-9]+(-.*)(\.html)$ {

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.