Nginx重写语法

我见过一堆ngnix重写,其语法如下:

server { server_name www.example.com; rewrite ^(.*) http://example.com$1 permanent; } 

我不明白^(.*)部分。 是否把所有的东西都放在ULD的TLD之后?

^的确在字符串的开头匹配。 在nginx的rewrite指令的情况下,这意味着实际URI的路径组件的开始。 不幸的是nginx的文档稍微不正确。 从http://www.nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite引用:

如果指定的正则表达式与URI匹配,则URI将按照替换字符串中的指定进行更改。

但是,这在技术上是错误的。 rewrite不匹配整个URI / URL,但只有它的路径组件(它始终以/开头,即使用户只输入例如http://www.example.com而不是http://www.example.com/ ) 。 因此rewrite ^(.*) http://example.com$1 permanent; 不会变成http://example.comwww.example.com

如果我记得正确, ^只是设置正则表达式规则来匹配字符串的开始。 括号用于提取$ 1-9变量的部分。

另一个来自Nginx wiki的解决方案。 链接

 server { server_name www.example.com; rewrite ^ http://example.com$request_uri? permanent; }