Имя сервера nginx регулярное выражение, когда заголовок "Host" имеет конечную точку

Я рассмотрел потенциальную конечную обработку точек имени хоста в двух контекстах в nginx, и мне было любопытно, необходимо ли использовать любой из них для совершенно правильной конфигурации:

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

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

1 ответ

Нет, это не нужно ни в одном из контекстов - nginx автоматически заботится о конечной точке, как в контексте $host переменная, а также server_name директива, оставляя только $http_host переменная с дополнительной точкой (если присутствует в запросе).

Я считаю, что это реализовано в http/ngx_http_request.c#ngx_http_validate_host:

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\.?)$
%

Обратите внимание, что ни regexp захвата изнутри server_name директива, ни $host переменная, всегда имеет конечную точку. Таким образом, бессмысленно объяснять это в вышеприведенных контекстах.

Другие вопросы по тегам