微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Nginx server_name翻译

http://nginx.org/en/docs/http/server_names.html#regex_names

匹配优先顺序

  1. 精确名称,无通配符,无正则。
  2. 以星号开头的最长的通配名称,例如"*.example.org"。
  3. 以星号结尾的最长的通配名称,例如"mail.*"
  4. 一个能匹配的正则表达式名称(按在配置文件中出现的顺序)。

通配符的server_name

  1. 通配符只能在server_name的开头或结尾,且星号只能在"."的外面包含。
  2. 尽管"www.*.example.org"和"w*.example.org"是无效的,但是可以使用正则表达式指定这些名称,如"^www\..+\.example\.org$"和"^w.*\.example\.org$"。
  3. 还有一种特殊形式:".example.org"既可以精确匹配"example.org",又可以匹配通配符形式的"*.example.org"。

使用正则表达式的server_name

  1. Nginx使用的正则表达式与Perl编程语言(PCRE)使用的正则表达式兼容。要使用正则表达式,服务器名称必须波浪号开头:
server_name ~^www\d+\.example\.net$;
表达式 描述
^ 匹配字符开头的字符
$ 匹配字符结尾的字符
x? 匹配 0 次或一次 x 字符串
. 匹配除换行符以外的所有字符
.* 匹配 0 次或多次的任何字符
.+ 匹配 1 次或多次的任何字符
\d 匹配一个数字的字符,和 [0-9] 语法一样
\d+ 匹配多个数字字符串,和 [0-9]+ 语法一样
\w 英文字母或数字的字符串,和 [a-zA-Z0-9_] 语法一样
\w+ 和 [a-zA-Z0-9_]+ 语法一样
{m,n} 匹配在 m个 以上 n个 以下 的指定字符串

参考自:https://www.runoob.com/perl/perl-regular-expressions.html

  1. 如果不以波浪号开头,则将被视作精确名称或者通配名称(如果包含星号)。
  2. 一定要加上'^'和'$'锚点,虽然在语法上不是必需的,但在逻辑上,是有必要的。
  3. 注意,域名的点'.'应以反斜杠转义:'\.'。否则将被视作正则匹配符号。
  4. 包含字符"{"和"}"的正则表达式应加引号:
server_name "~^(?<name>\w\d{1,3}+)\.example\.net$";
  否则,Nginx将无法启动并报错:directive "server_name" is not terminated by ";" in ...
  1. 一个被命名了的正则表达式捕获可在以后用作变量:
server {
    server_name   ~^(www\.)?(?<domain>.+)$;

    location / {
         root   /sites/$domain;
     }
}

PCRE库使用以下语法支持命名捕获:
?<name> 与Perl 5.10兼容的语法,自PCRE-7.0开始受支持
?'name' 与Perl 5.10兼容的语法,自PCRE-7.0开始受支持
?P<name> 自PCRE-4.0起受支持的Python兼容语法

如果Nginx无法启动并显示错误消息:pcre_compile() Failed: unrecognized character after (?< in ...
这意味着PCRE库很旧,应尝试使用语法"?P<name>"。捕获也可以以数字形式来引用:

server {
    server_name   ~^(www\.)?(.+)$;

    location / {
        root   /sites/$2;
    }
}

但是,考虑到数字形式的引用很容易被覆盖,所以这种用法应仅限于简单的情况(像上面的例子)。

待续...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐