【发布时间】:2012-03-19 04:03:04
【问题描述】:
我见过一堆语法如下的 ngnix 重写:
server {
server_name www.example.com;
rewrite ^(.*) http://example.com$1 permanent;
}
我不明白^(.*) 部分。 ^ 是否在 uri 的 TLD 之后获取所有内容?
【问题讨论】:
我见过一堆语法如下的 ngnix 重写:
server {
server_name www.example.com;
rewrite ^(.*) http://example.com$1 permanent;
}
我不明白^(.*) 部分。 ^ 是否在 uri 的 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 的另一个解决方案。 Link
server {
server_name www.example.com;
rewrite ^ http://example.com$request_uri? permanent;
}
【讨论】:
^ 让我感到困惑。我同意你的观点,通常它的意思是“行首”,但如果是这样的话,那么 ^(.*) 应该抓住整个 url,因此,http://example.com$1 应该类似于example.comwww.example.com,对吗?如果它抓住了整个网址?
? 在$request_uri 之后的目的是什么,这是否意味着整个事情都是可选的?这还不是默认行为吗? ..因为我看到很多地方写的都没有问号。