【问题标题】:Nginx rewrite syntaxNginx 重写语法
【发布时间】:2012-03-19 04:03:04
【问题描述】:

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

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

我不明白^(.*) 部分。 ^ 是否在 uri 的 TLD 之后获取所有内容?

【问题讨论】:

    标签: nginx rewrite


    【解决方案1】:

    ^ 确实在字符串的开头匹配。对于 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

    【讨论】:

    • 没有。 URI 和 URL 都指代整个事物(schema://host/path...)。见en.wikipedia.org/wiki/Url。 nginx 匹配的既不是 URL 也不是 URI,而只是 URI/URL 的路径部分。在我的示例中,URI/URL 以“h”开头,路径组件以“/”开头。
    • 即使您的意思是说 URL 中的路径组件与 URI 中的路径组件不同(可能是也可能不是):这与 nginx 无关'总是以“/”开头的透视图。
    • @Mortiz Bunkus - 已撤回,似乎我将 URI 与它(显然不正确)在我过去使用的软件框架中的使用混淆了,由于某种原因将其用作路径
    【解决方案2】:

    如果我没记错的话,^ 只是将正则表达式规则设置为匹配字符串的开头。 括号用于提取具有 $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 之后的目的是什么,这是否意味着整个事情都是可选的?这还不是默认行为吗? ..因为我看到很多地方写的都没有问号。
    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 2014-08-09
    • 1970-01-01
    • 2016-12-14
    相关资源
    最近更新 更多