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

问题描述

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

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

my.domain.com/avocado/banana --> my.domain.com/avocado/banana/ my.domain.com/avocado/banana/apple --> my.domain.com/avocado/banana/apple/

现在,我们注意到以“/--”作为最后一个子路径的 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$1 permanent;
    }
    rewrite ^([^.]*[^/])$ https://$server_name$1/ 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