【问题标题】:Regex don't work as expected in nginx map正则表达式在 nginx 映射中无法按预期工作
【发布时间】:2021-07-20 02:48:40
【问题描述】:

我正在尝试在 nginx 中实现一些 URL 重写规则。我使用类似的正则表达式来捕获有趣的组,它在 regex101 和 IIS 重写规则的正则表达式中完美运行,但在 nginx 映射中不起作用。不知道nginx有没有具体的语法,我也查不出来。

  map $request_uri $new_uri {        
      default '';
      
      # this works without the query string part
      #"~^/r/([\S]+)\.jpg$" http://www.jackli.space/$1.jpg;

      "~^/r/([\S]+).(png|jpg|jpeg)\?a=(\d+)$" http://www.jackli.space/$1.$2?x=$3;
  }

我测试的示例图片 src url

<img src="r/images/bridge.jpg?a=100" />

【问题讨论】:

  • 你能显示你正在尝试使用的重写规则吗?
  • 这里是 nginx map $request_uri $new_uri { default ''; "~^/r/([\S]+).(png|jpg|jpeg)\?a=(\d+)$" http://www.jackli.space/$1.$2?x=$3; } server { listen 4000; location / { if ($new_uri) { rewrite ^(.*)$ $new_uri permanent; } proxy_pass http://backend:5000; } }的示例配置文件
  • 尝试return 301 $new_uri; 而不是rewrite 指令。而且您最好将该配置片段添加到您的问题中,cmets 中的降价格式不适合多行代码块。
  • @IvanShatsky,我试过这个,它不工作。我之所以没有将配置放在问题中是因为它无关紧要,问题出在正则表达式中而不是在配置中。
  • 我在您的正则表达式中看不到任何错误。在我的本地机器上进行了测试,一切都按预期工作(请参阅使用的 nginx 配置和 curl 日志here)。

标签: regex nginx url-rewriting nginx-config


【解决方案1】:

您可以使用命名的捕获组尝试此块:

map $request_uri $new_uri {        
   default 0;
      
   # this works without the query string part
   #"~^/r/([\S]+)\.jpg$" http://www.jackli.space/$1.jpg;

   "~^/r/(?<file>\S+)\.(?<ext>png|jpg|jpe?g)\?a=((?<a>\d+)$" http://www.jackli.space/$file.$ext?x=$a;
}

【讨论】:

  • 不幸的是,这不起作用。但是我在我使用的正则表达式组中发现了一个错误(已在问题中修复),但它仍然无法正常工作。
  • 您用来测试的完整 URL 是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多