Как изменить заголовок сервера, возвращаемый nginx?


142

Есть возможность скрыть версию, чтобы она отображала только nginx, но есть ли способ скрыть и ее, чтобы она ничего не показывала или не меняла заголовок?


34
кстати, чтобы скрыть версию nginx, вам нужно отключить server_tokens.
yanchenko

2
Если вы хотите удалить nginx из заголовка, вы также можете удалить его из перенаправлений и страниц ошибок.
fabianegli

Ответы:


57

Как и Apache, это быстрое редактирование исходного кода и повторная компиляция. С сайта Calomel.org :

Строка Server: - это заголовок, который отправляется обратно клиенту, чтобы сообщить ему, какой тип http-сервера вы используете и, возможно, какую версию. Эта строка используется такими местами, как Alexia и Netcraft, для сбора статистики о том, сколько и какого типа веб-серверы находятся в Интернете. Для подтверждения автора и статистики для Nginx мы рекомендуем оставить эту строку как есть. Но в целях безопасности вы можете не захотеть, чтобы люди знали, что вы запускаете, и вы можете изменить это в исходном коде. Отредактируйте исходный файл, src/http/ngx_http_header_filter_module.c посмотрев строки 48 и 49. Вы можете изменить String на все, что захотите.

## vi src/http/ngx_http_header_filter_module.c (lines 48 and 49)
static char ngx_http_server_string[] = "Server: MyDomain.com" CRLF;
static char ngx_http_server_full_string[] = "Server: MyDomain.com" CRLF;

Правка от марта 2011 года: Подсказки к Flavius ​​ниже за указание на новую опцию, заменяющую стандартный HttpHeadersModule Nginx на разветвленный HttpHeadersMoreModule . Перекомпиляция стандартного модуля по-прежнему является быстрым решением и имеет смысл, если вы хотите использовать стандартный модуль и не будете часто менять строку сервера. Но если вы хотите большего, HttpHeadersMoreModule - это сильный проект, который позволяет вам делать все виды черной магии во время выполнения с вашими заголовками HTTP.


18
с помощью server_tokens off; это, безусловно, самый простой способ сделать это ... не забудьте поместить его в блок "http" или "server"
farinspace

35
Это скрывает номер версии, но возникает вопрос: «Я знаю, что могу скрыть номер версии, как мне изменить или удалить всю строку« Сервер »?» Нет возможности сделать это с помощью готового nginx.
joelhardi 08

Еще одно быстрое исправление (для версии 1.7.8), позволяющее полностью удалить заголовок сервера: закомментировать строки 49 и 50 (соответствующие строкам 48, 49 выше), 280-283 и 458-469. Для справки в будущем: последние два являются установленными блоками if r->headers_out.server.
pauluss86 04

3
Этот ответ немного устарел. Ответ @jamescampbell теперь более точен.
jmcollin92

Если вы планируете использовать этот метод для маскировки своего сервера, вы также можете изменить файл src / http / ngx_http_special_response.c, чтобы изменить сообщения об ошибках сервера.
Броган

147

Если вы используете nginx для проксирования серверного приложения и хотите, чтобы серверная часть рекламировала свой собственный Server:заголовок без его перезаписи nginx, вы можете войти в свою server {…}строфу и установить:

proxy_pass_header Server;

Это убедит nginx оставить этот заголовок в покое и не перезаписывать значение, установленное серверной частью.


11
Если вы вносите это изменение из соображений безопасности, я не уверен, что этого достаточно. Если вашему серверу необходимо вернуть сообщение об ошибке, заголовок по-прежнему будет «nginx»
KC Baltz

10
хотя это легко решает проблему, однако следует принять во внимание одну вещь: при использовании обратного прокси-сервера статические файлы обслуживаются через nginx, поэтому, когда вы открываете, например, изображение в сетевой панели firebug, вы все равно можете видеть сервер как nginx
dav

ИМО, это лучший ответ. Это решение не требует специального программного расширения и работает с базовым nginx.
Крис

83

Последнее обновление было некоторое время назад, поэтому вот что у меня сработало на Ubuntu:

sudo apt-get update
sudo apt-get install nginx-extras

Затем добавьте следующие две строки в httpраздел nginx.conf, который обычно находится в /etc/nginx/nginx.conf:

sudo nano /etc/nginx/nginx.conf
server_tokens off; # removed pound sign
more_set_headers 'Server: Eff_You_Script_Kiddies!';

Также не забудьте перезапустить nginx с sudo service nginx restart.


2
Есть что-то подобное на YUM? yum install nginx-extras не работал.
PKHunter

3
@PKHunter Я еще не пробовал на дьявольском языке YUM, но я посмотрю, что смогу найти.
jamescampbell

2
Это, безусловно, лучший ответ. Это должно быть принято. Это только один ответ на все случаи.
jmcollin92

6
Установка пустой строки для Server: подавляет заголовок сервера:more_set_headers 'Server: ';
Cody Craven

1
Спасибо, это работает как шарм без какой-либо перекомпиляции. Молодец;)
MitchellK

38

Просто отредактируйте /etc/nginx/nginx.conf и удалите комментарий из

#server_tokens off;

Найдите раздел http .


3
это работает хорошо, как только вы это сделаете, все, что вы можете увидеть о сервере в информации заголовков, это: nginx (без номера версии) Спасибо! : D
jacktrade

13
Автор вопроса уже знает об этой опции, которая удаляет номер версии, но не позволяет вам настраивать значение, возвращаемое в заголовке «server».
Makotosan

12
Это скрывает не все, а только серверную версию.
Цифровой сайт

3
Не удаляет заголовок ответа для Server = nginx
саша

Я думаю, что передача версии nginx является проблемой безопасности. Так что для многих это «достаточно хорошее» решение. Также стоит отметить, что это должно быть включено в каждый серверный блок, если у вас есть серверный блок для портов 80 и 443.
Джереми

36

Это очень просто: добавьте эти строки в раздел сервера:

server_tokens off;
more_set_headers 'Server: My Very Own Server';

10
Вы должны собрать Nginx с 3 - го модуля партия wiki.nginx.org/HttpHeadersMoreModule для этого
Хостмастер

10
В Ubuntu вы можете установить nginx-extraэтот модуль.
Stan Bondi

11
если верить авторасширению apt-get, это nginx-extras с
буквой

1
Обратите внимание, что вам нужен префикс «Сервер:», чтобы переопределить существующее значение «Сервер:».
elBradford

25

Есть специальный модуль: http://wiki.nginx.org/NginxHttpHeadersMoreModule

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

Это расширенная версия стандартных заголовков модуль , поскольку он обеспечивает больше утилита , как сброс или очистку «заголовки встроенных» , как Content-Type, Content-Length, и Server.

Он также позволяет вам указать необязательные критерии кода состояния HTTP с помощью -sпараметра и необязательные критерии типа содержимого с помощью -tпараметра при изменении выходных заголовков с помощью директив more_set_headers и more_clear_headers ...


3
Скомпилируйте nginx с помощью--add-module=/path-to-headers-more-nginx-module
mate64

Похоже, это было перемещено в OpenResty: github.com/openresty/headers-more-nginx-module#readme
Бен

Есть ли способ получить этот модуль без необходимости перекомпилировать nginx из исходников для Centos 7?
Prachi

21

Установить Nginx Extras

sudo apt-get update
sudo apt-get install nginx-extras

Сведения о сервере можно удалить из ответа, добавив следующие две строки в nginx.conf (в разделе http)

more_clear_headers Server;
server_tokens off;

Во-первых, это то, что упомянул @jamescampbell выше. Во-вторых, для этого требуется, чтобы Nginx был скомпилирован из исходного кода ( yum install nginx-extrasне работает - я полагаю, это работает на Debia / Ubuntu и т apt-get. Д. С.)
Хом Назид

Он работает без компиляции nginx из исходников. Вам нужно только загрузить модуль: ngx_http_headers_more_filter_module из nginx.conf
creekorful

после запуска "apt-get install nginx-extras" он понизил версию моего nginx с 1.16 до 1.14
grayaii

15

Если вы не против просто изменить заголовок на другую строку из пяти букв или меньше, вы можете просто исправить двоичный файл.

sed -i 's/nginx\r/thing\r/' `which nginx`

Что как решение имеет несколько заметных преимуществ. А именно, что вы можете разрешить управление версиями nginx с помощью диспетчера пакетов (то есть без компиляции из источника), даже если nginx-extras недоступны для вашего дистрибутива, и вам не нужно беспокоиться о каких-либо дополнительных код чего-то вроде nginx-extras уязвим.

Конечно, вы также захотите установить опцию server_tokens off , чтобы скрыть номер версии или исправить эту строку формата.

Я говорю «пять букв или меньше», потому что, конечно, вы всегда можете заменить:

nginx \ r \ 0

с участием

боб \ г \ 0 \ г \ 0

оставив последние два байта без изменений.

Если вам действительно нужно более пяти символов, вы захотите оставить server_tokens включенным и заменить (немного более длинную) строку формата, хотя опять же существует верхний предел этой длины, налагаемый длиной строки формата - 1 (для возврат каретки).

... Если ничто из вышеперечисленного не имеет для вас смысла или вы никогда раньше не исправляли бинарный файл, возможно, вам стоит отказаться от этого подхода.


1
@PKHunter хм? Преимущество этого в том, что он работает без необходимости компилировать с нуля. Исходный код не используется. Он исправляет скомпилированный двоичный файл напрямую.
Парфянский выстрел

1
Он вообще не знает о формате файла - он просто заменяет последовательность байтов другой последовательностью байтов, поэтому всегда стоит действительно проверять, что последовательность байтов, которую вы заменяете, действительно является просто строкой, которую вы хотите заменить, а не скажем, исполняемый код в подпрограмме (что маловероятно, но все же).
Парфянский выстрел

1
Таким образом, вы просто запустите эту sedкоманду выше, `which nginx`часть возвращает путь к двоичному файлу, а sedкоманда выполняет замену байта.
Парфянский выстрел

1
Нулевые байты, упомянутые позже в ответе, относятся к тому факту, что вы можете использовать более короткие заголовки, чем полная длина строки, если вы заканчиваете замену нулевым байтом. en.wikipedia.org/wiki/Null-terminated_string
Парфянский выстрел,

1
Ах. Да, это исполняемый файл. И вам также необходимо быть пользователем с разрешением на запись в файл. И я не удивлюсь, если вам потребуется перезапуск, nginxчтобы изменения вступили в силу. Все что сказано? Я призываю вас не использовать один из других ответов. Если все, о чем я говорю, вам еще не знакомо, и вы не знаете, для чего предназначен этот /etcкаталог, то подобный взлом довольно опасен.
Парфянский выстрел

2

Единственный способ - изменить файл src / http / ngx_http_header_filter_module.c. Я изменил nginx в строке 48 на другую строку.

Что вы можете сделать в файле конфигурации nginx, так это отключить server_tokens . Это предотвратит печать номера версии nginx.

Чтобы проверить, попробуйте curl -I http://vurbu.com/ | grep сервер

Он должен вернуться

Server: Hai

3
Что ж, это не единственный способ. Другие альтернативы были показаны в других ответах.
Radko Dinev

1

Прочитав ответ Парфянского выстрела, я копаюсь в /usr/sbin/nginxдвоичном файле. Потом я обнаружил, что файл содержит эти три строки.

Server: nginx/1.12.2
Server: nginx/1.12.2
Server: nginx

В основном первые два из них предназначены для server_tokens on;директивы (включая версию Сервера). Затем я изменяю критерии поиска, чтобы они соответствовали этим строкам в двоичном файле.

sed -i 's/Server: nginx/Server: thing/' `which nginx`

Покопавшись дальше, я обнаружил, что сообщение об ошибке, созданное nginx, также включено в этот файл.

<hr><center>nginx</center>

Их три, один без версии, два с версией. Поэтому я запускаю следующую команду, чтобы заменить строку nginx в сообщении об ошибке.

sed -i 's/center>nginx/center>thing/' `which nginx`

Спасибо за это. Но ваша первая команда, выполненная внутри /usr/sbinпапки, дает следующее:sed: can't read is: No such file or directory
Хом Назид

1

Согласно документации nginx он поддерживает настраиваемые значения или даже исключение:

Syntax: server_tokens on | off | build | string;

но, к сожалению, только с коммерческой подпиской :

Кроме того, в рамках нашей коммерческой подписки, начиная с версии 1.9.13, подпись на страницах с ошибками и значение поля заголовка ответа «Сервер» могут быть заданы явно с помощью строки с переменными. Пустая строка отключает выдачу поля «Сервер».


1

Пакет Nginx-extra устарел.

Поэтому теперь у меня сработало следующее, поскольку я пытался установить различные пакеты more_set_headers 'Server: My Own Server';

Вы можете просто сделать следующее, и информация о сервере или версии не будет отправлена ​​обратно

    server_tokens '';

если вы просто хотите удалить номер версии, это работает

   server_tokens off;

0

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

Сначала установите пакет nginx-extras

sudo apt установить nginx-extras

Затем загрузите модуль nginx http headers more, отредактировав nginx.conf и добавив следующую строку внутри блока сервера

load_module modules / ngx_http_headers_more_filter_module.so;

Как только это будет сделано, у вас будет доступ к директивам more_set_headers и more_clear_headers.


-5

Вы спрашиваете о значении заголовка сервера в ответе? Вы можете попробовать изменить это с помощью директивы add_header, но я не уверен, что это сработает. http://wiki.codemongers.com/NginxHttpHeadersModule


1
да, заголовок сервера. но нет ли более чистого способа, как, например, на lighttpd, где у меня есть только server.tag = "something"? add_header работает только для кодов ответа 200, 204, 301, 302 или 304, поэтому, если сервер каким-то образом выполнит 500, он не будет работать,
Дэниелс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.