当“主机”标题有一个尾随点时,nginx服务器名称正则表达式

时间:2017-07-28 00:56:52

标签: http nginx http-headers httprequest

我在nginx中考虑了potential trailing hostname dot handling in two contexts,并且很好奇是否需要使用任何一个来完全正确的配置:

  • server_name ~^(\w+)\.(example\.com)\.?$;

  • if ($host ~ ^(\w*)\.(example\.com)\.?$) {

1 个答案:

答案 0 :(得分:0)

不,在任何一个上下文中都没有必要 - 在$host variableserver_name directive的上下文中,nginx会自动处理尾随点,只留下{{3}带有额外的点(如果在请求中存在)。

我相信它已在$http_host variable中实施:

1925    if (dot_pos == host_len - 1) {
1926        host_len--;
1927    }

可以使用以下最小配置进行验证:

server {
    listen  [::]:7325;
    server_name ~^(\w*)\.?(example\.com\.?)$;
    return  200 C:$2\tH:$host\tHH:$http_host\tSN:$server_name\n;
}

针对nginx/1.2.1运行以下测试:

%printf 'GET / HTTP/1.0\nHost: head.example.com.\n\n' | nc localhost 7325 | fgrep example
C:example.com   H:head.example.com  HH:head.example.com.    SN:~^(\w*)\.?(example\.com\.?)$
%
%printf 'GET http://line.example.com./ HTTP/1.0\n\n' | nc localhost 7325 | fgrep example
C:example.com   H:line.example.com  HH: SN:~^(\w*)\.?(example\.com\.?)$
%
%printf 'GET http://line.example.com./ HTTP/1.0\nHost: head.example.com.\n\n' | nc localhost 7325 | fgrep example
C:example.com   H:line.example.com  HH:head.example.com.    SN:~^(\w*)\.?(example\.com\.?)$
%

请注意,server_name指令中的正则表达式捕获和$host变量都没有尾随点。因此,在上述情况下考虑它是没有意义的。