Как изменить заголовок сервера, возвращаемый 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.

Joelhardi
источник
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
Jauder Ho
источник
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, подпись на страницах с ошибками и значение поля заголовка ответа «Сервер» могут быть заданы явно с помощью строки с переменными. Пустая строка отключает выдачу поля «Сервер».

adrhc
источник
1

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

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

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

    server_tokens '';

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

   server_tokens off;
Prajwal
источник
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, он не будет работать,
Дэниелс