nginx不区分大小写的重写

mil*_*uni 18 rewrite nginx

我试图让我的 nginx 重定向尽可能干净。我知道 ~* 不区分大小写,但我只能让它在示例 2 中工作。

示例 1

rewrite ^/foobar http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;
Run Code Online (Sandbox Code Playgroud)

示例 2 - 这有效,但不如上面的行有效。

if ( $request_filename ~* foobar ) {
         rewrite ^ http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;
   }
Run Code Online (Sandbox Code Playgroud)

有没有办法使用示例 1 进行不区分大小写的重定向而不会让它变得太混乱?

谢谢。

小智 37

我发现可以使这项工作:

rewrite ^/foobar http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;
Run Code Online (Sandbox Code Playgroud)

你只需要这样做:

rewrite (?i)^/foobar http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;
Run Code Online (Sandbox Code Playgroud)

这只是意味着前置 (?i) 否则匹配的一切都是相同的。

  • 这应该是公认的答案。 (4认同)
  • 谢谢你。如此简单,但在 Nginx 文档中却很难找到。非常感谢简洁的指针! (2认同)

小智 13

我刚遇到(并解决了)同样的问题,最后来到这里试图找到答案。nginx 文档(http://nginx.org/en/docs/http/ngx_http_rewrite_module.html)没有明确说明 ~* 仅在 if 语句中有效,但显然情况就是如此。

要在 if 语句之外为 ngnix URL 重写获得不区分大小写的正则表达式匹配,我必须使用 Apache/Perl 样式:

rewrite "(?i)foobar" http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;
Run Code Online (Sandbox Code Playgroud)

请参阅http://perldoc.perl.org/perlretut.html(搜索 insensitive)。似乎在特定捕获组之外添加前缀 (?i) 使其适用于整个搜索字符串。注意:这似乎不适用于“^(?i)foobar”,因为似乎隐含了“^”。

不过,可以肯定的是,如果你最终做了一堆重写,为了使任何未来的重写更容易维护和更少歧义,你可能想要做这样的事情:

location /foobar {
     rewrite "(?i)" http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助...