正确的 Nginx 正则表达式,用于使用双连字符重定向 URL

Proper Nginx regex for redirection of URLs with double hyphen

这是我第一次 post。希望我能够彻底解释我的问题。

我有一个 Nginx 配置,可以将 my.domain.com/avocado 重定向到 my.domain.com/avocado/(最后有一个斜线)。这也会在 /avocado 路径之后重定向子路径(以斜杠结尾),例如:

my.domain.com/avocado/香蕉 --> my.domain.com/avocado/香蕉/ my.domain.com/avocado/香蕉/苹果 --> my.domain.com/avocado/香蕉/苹果/

现在,我们注意到以“/--”作为最后一个子路径的 URL(例如:my.domain.com/avocado/banana/apple/--)没有正确重定向。它应该重定向到 my.domain.com/avocado/banana/apple/(在最后一个子路径后附加一个斜线)

我认为这也是正则表达式的东西,但我不知道如何正确地做到这一点。你们会建议任何正则表达式吗?谢谢!

server {
  server_name my.domain.com;
  location /avocado {
    resolver 10.1.0.2 valid=60s;
    if ($http_x_forwarded_proto != "https") {
       rewrite ^(.*)$ https://$server_name permanent;
    }
    rewrite ^([^.]*[^/])$ https://$server_name/ permanent;
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $host;
    proxy_pass http://$upstreamserver$request_uri;
}

}

这是你的第一个问题,也是我的第一个答案。

我看到有两种方法可以做到这一点。

  1. ^([^.]*)(?:(?<!/|--)|/--)$
    • ^([^.]*) 从行的开头,尽可能多次捕获所有不是点的内容,并根据需要返回。
    • (?:(?<!/|--)|/--)$ 在行尾没有 //-- 时捕获行尾,如果在行尾没有 /--它存在,然后用 /.
    • 替换它们
    • Regex101
  2. ^([^.]*?)(?:/--)?(?<!/)$
    • ^([^.]*?) 从行的开头,尽可能少地捕获所有不是点的内容,并根据需要扩展。
    • (?:/--)? 匹配 /-- 如果它存在但不捕获它。
    • (?<!/)$ 如果行尾前面没有 /.
    • 则匹配
    • Regex101