nginx不区分大小写的重写


15

我试图使我的Nginx重定向尽可能干净。我知道〜*是不区分大小写的,但是我只能在示例2中使用它。

例子1

rewrite ^/foobar http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;

例2-这行得通,但是效率不如上一行。

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

有没有一种方法可以对示例1进行不区分大小写的重定向,而又不会太混乱呢?

谢谢。

Answers:


10

我只是遇到了(并已解决)了同样的问题,并最终在这里找到答案。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;

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

但是,为了确保将来所做的任何重写,如果要使它们更容易维护和减少歧义,则可能需要执行以下操作:

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

希望这可以帮助...


30

我发现可以使这项工作:

rewrite ^/foobar http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;

您只需要这样做:

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

这仅表示前缀(?i),否则匹配的所有内容都相同。


4
这应该是公认的答案。
thekingoftruth

2
谢谢。非常简单,但是却很难在Nginx文档中找到。非常感谢简洁的指针!
PKHunter '17

1

现在在网站上工作,我发现这似乎也可行。对于最近处于同样情况的任何人,我都处于最近的几个小时中。

location ~* ^/foobar {
  rewrite ^(.*)$ $scheme://$http_host/whatever/foobar redirect;
}
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.