Подтвердить что ты не робот

Полный URL-адрес записи в журнале nginx

Мы используем следующий файл конфигурации nginx site в нашем проекте env.

log_format main '$http_x_forwarded_for - $remote_user [$time_local] "$request" '
                '$status $body_bytes_sent "$http_referer" '
                '"$http_user_agent" $request_time';



server {
        root /srv/www/web;
        server_name *.test.com;
        access_log /var/log/nginx/xxx.test.com.access.log main;

Оба "http://a.test.com/ping" и "http://b.test.com/ping" http-запрос будет записан в файл xxx.test.com.access.log.

Но есть проблема, nginx не сохраняет "доменное имя" в xxx.test.com.access.log.

"http://a.test.com/ping" и "http://b.test.com/ping" используют один и тот же запрос "Get/ping".

Как я могу записать "a.test.com" или "b.test.com" в журнале nginx?

4b9b3361

Ответ 1

Попробуйте добавить переменную $host в log_format:

log_format main '$http_x_forwarded_for - $remote_user [$time_local] "$host" "$request" '
            '$status $body_bytes_sent "$http_referer" '
            '"$http_user_agent" $request_time';

http://wiki.nginx.org/HttpCoreModule#.24host:

$хост

Эта переменная равна строке Host в заголовке запроса или имени сервера, обрабатывающего запрос, если заголовок Host не является доступны.

Эта переменная может иметь другое значение от $http_host в таких случаях: 1) когда отсутствует входной заголовок хоста или имеет пустое значение, $host равно значению директивы server_name; 2), когда значение Host содержит номер порта, $host не включает этот номер порта. Значение $host всегда имеет нижний регистр с 0.8.17.

Ответ 2

Если вы хотите зарегистрировать полный запрошенный URL-адрес, тогда мой метод

log_format main '$http_x_forwarded_for - $remote_user [$time_local] '
'"$request_method $scheme://$host$request_uri $server_protocol" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $request_time';

Итак, разделим $request на его составные части и выставим $host посередине. Также вы можете увидеть, является ли запрос http: https.

Ответ 3

Вы также можете попробовать добавить $http_host

$host является переменной модуля Core.

$хост

Эта переменная равна строке Host в заголовке запроса или имя сервера, обрабатывающего запрос, если заголовок узла не является доступны.

Эта переменная может иметь другое значение от $http_host в таких случаях: 1) когда отсутствует входной заголовок хоста или имеет пустое значение, $host равно значению директивы server_name; 2), когда значение Host содержит номер порта, $host не включает этот номер порта. Значение $host всегда имеет нижний регистр с 0.8.17.

$http_host также является переменной того же модуля, но вы не найдете его с этим именем, потому что он определяется как $http_HEADER (ref).

$http_HEADER

Значение заголовка HTTP-заголовка HEADER при преобразовании в нижний регистр и с тиреми, преобразованными в "подчеркивания", например. $http_user_agent, $http_referer...;


Резюмируя:

  • $http_host всегда всегда является заголовком запроса HTTP_HOST.
  • $host равно $http_host, в нижнем регистре и без номера порта (если имеется), кроме случаев, когда HTTP_HOST отсутствует или является пустым значением. В этом случае $host равно значению директивы server_name сервера, обработавшего запрос.