Имя сервера 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
переменная, всегда имеет конечную точку. Таким образом, бессмысленно объяснять это в вышеприведенных контекстах.