nginxから返されるサーバーヘッダーを変更するにはどうすればよいですか?


141

バージョンを非表示にしてnginxのみを表示するオプションがありますが、何も表示したりヘッダーを変更したりしないように非表示にする方法はありますか?


34
ところで、nginxバージョンを非表示にするには、「server_tokens off」を設定する必要があります。
yanchenko 2009年

2
ヘッダーからnginxを削除したい場合は、リダイレクトやエラーページからnginxを削除することもできます。
fabianegli

回答:


57

Apacheと同様に、これはソースをすばやく編集して再コンパイルします。Calomel.orgから:

Server:文字列は、クライアントに返送されるヘッダーであり、実行しているhttpサーバーのタイプと、場合によってはどのバージョンかを伝えます。この文字列は、AlexiaやNetcraftなどの場所で、インターネット上に存在するWebサーバーの数と種類に関する統計を収集するために使用されます。Nginxの作者と統計をサポートするために、この文字列をそのまま保持することをお勧めします。ただし、セキュリティ上の理由から、自分が何を実行しているのかを他の人に知られたくない場合は、ソースコードでこれを変更できます。src/http/ngx_http_header_filter_module.c 48行目と49行目を見てソースファイルを編集します 。文字列は任意に変更できます。

## 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年3月編集: Nginxの標準のHttpHeadersModuleをフォークされたHttpHeadersMoreModuleに置き換えて、新しいオプションを指摘するための以下のフラビウスへの小道具。標準モジュールを再コンパイルすることはまだ簡単な修正であり、標準モジュールを使用したいがサーバー文字列を頻繁に変更しない場合には理にかなっています。しかし、それ以上の機能が必要な場合、HttpHeadersMoreModuleは強力なプロジェクトであり、HTTPヘッダーを使用してあらゆる種類のランタイムブラックマジックを実行できます。


18
「server_tokens off;」を使用する これは断然最も簡単な方法です... "http"または "server"ブロックに入れてください
farinspace

35
バージョン番号は非表示になりますが、質問は「バージョン番号を非表示にできることはわかっています。「サーバー」文字列全体を変更または削除するにはどうすればよいですか?」すぐに使えるnginxを使用してこれを行う方法はありません。
joelhardi

サーバーヘッダーを完全に削除する別のクイックフィックス(バージョン1.7.8の場合)は、49行目と50行目(上記の48、49行目に対応)、280-283および458-469をコメント化することです。将来の参考のために、最後の2つはどちらもifブロックで設定されr->headers_out.serverます。
pauluss86 14

3
この答えは少し古いですが、今は古いです。@jamescampbellの答えがより正確になりました。
jmcollin92 2016年

この方法を使用してサーバーをマスクする場合は、src / http / ngx_http_special_response.cファイルを編集してサーバーのエラーメッセージを変更することもできます。
Brogan

143

nginxを使用してバックエンドアプリケーションのプロキシを作成し、バックエンドがServer:nginxを上書きせずに独自のヘッダーをアドバタイズするようにしたい場合は、server {…}スタンザの内部に移動して設定できます。

proxy_pass_header Server;

これにより、nginxはそのヘッダーをそのままにし、バックエンドによって設定された値を書き換えないようになります。


11
セキュリティ上の理由でこの変更を行っている場合、これで十分かどうかはわかりません。サーバーがエラーメッセージを返す必要がある場合でも、ヘッダーは「nginx」のままです
KC Baltz

10
これは問題を簡単に解決しますが、考慮すべき点が1つあります。リバースプロキシを使用すると、静的ファイルはnginxを介して提供されるため、たとえばFirebugネットパネルで画像を開くと、サーバーをnginxとして表示できます
dav

IMO、これが最良の答えです。このソリューションは、特別なソフトウェア拡張を必要とせず、ベースのnginxで動作します。
Kris

81

最後の更新は少し前のことなので、Ubuntuで私のために働いたものは次のとおりです。

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

次に、次の2行をの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 2016

3
@PKHunter私はYUMの悪魔の舌でそれを試していませんが、私が見つけることができるものを見ていきます。
jamescampbell 2016

2
これは確かに最良の答えです。それは受け入れられるべきです。これはすべてのケースに答える唯一のものです。
jmcollin92 2016年

6
サーバーに空の文字列を設定する:サーバーヘッダーを抑制します:more_set_headers 'Server: ';
コーディクレイブン

1
ありがとうございます。これは、再コンパイルすることなく、魅力のように機能します。よくやった;)
MitchellK

37

簡単です、/ etc / nginx / nginx.confを編集してコメントを削除します

#server_tokens off;

httpセクションを検索します


3
これはうまく機能します。これを実行すると、ヘッダー情報でサーバーに関するすべての情報を確認できます:nginx(バージョン番号なし)ありがとうございます。:D
ジャックトレード

13
質問の作成者は、バージョン番号を削除するこのオプションをすでに認識していますが、「サーバー」ヘッダーで返される値をカスタマイズすることはできません。
誠さん2013

12
これはすべてを隠すのではなく、サーバーのバージョンのみを隠します。
デジタルサイト

3
Server = nginxの応答ヘッダーは削除しません
sasha

nginxのバージョンを渡すことはセキュリティ上の問題だと思います。したがって、多くの人にとって、これは「十分に良い」ソリューションです。また、それは価値がある場合には、ポート80および443のためのサーバブロックを持っている、これは各サーバのブロックに行かなければならないだろうことは注目される
ジェレミー・

35

非常に簡単です。次の行をサーバーセクションに追加します。

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

10
そのためには、サードパーティのモジュールwiki.nginx.org/HttpHeadersMoreModuleを使用してnginxをコンパイルする必要があります
hostmaster

10
Ubuntuではnginx-extra、そのモジュールを取得するためにインストールできます。
スタンボンディ2014

11
apt-get autoexpansionを信じる場合は、末尾に「s」が付いたnginx-extrasです
Tjunkie

1
既存のServer:値を上書きするには、「Server:」プレフィックスが必要です。
elBradford 2017

25

特別なモジュールがあります:http : //wiki.nginx.org/NginxHttpHeadersMoreModule

このモジュールを使用すると、指定した出力または入力ヘッダーを追加、設定、またはクリアできます。

これは、標準の拡張版であるヘッダー、それはのように「ヘッダBUILTIN」リセットまたはクリアのような多くのユーティリティを提供したため、モジュールContent-TypeContent-LengthおよびServer

さらに、-sオプションを使用してオプションのHTTPステータスコード基準を指定し、オプションを使用してオプションのコンテンツタイプ基準を指定する-t一方で、more_set_headersおよびmore_clear_headersディレクティブを使用して出力ヘッダーを変更できます...


3
--add-module=/path-to-headers-more-nginx-module
nmatexを

これはOpenRestyに移動されたようです:github.com/openresty/headers-more-nginx-module#readme
Ben Creasy

Centos 7のソースからnginxを再コンパイルせずにこのモジュールを取得する方法はありますか?
プラチ

19

Nginx Extrasをインストールする

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

nginx.confに次の2行を追加することで、サーバーの詳細を応答から削除できます(httpセクションの下)

more_clear_headers Server;
server_tokens off;

1つは、これが上記の@jamescampbellです。次に、これはNginxをソースからコンパイルする必要があります(yum install nginx-extras動作しません-これはDebia / Ubuntuなどでapt-get。で動作すると思います)
Khom Nazid

ソースからnginxをコンパイルしなくても機能します。あなただけのモジュールをロードする必要があります:nginx.confからngx_http_headers_more_filter_module
クリークフル

「apt-get install nginx-extras」を実行した後、nginxのバージョンを1.16から1.14にダウングレードしました
grayaii

15

ヘッダーを5文字以下の別の文字列に変更するだけで問題がなければ、バイナリにパッチを適用するだけです。

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

これには、解決策として、いくつかの顕著な利点があります。つまり、あなたのディストリビューションでnginx-extrasが利用できない場合でも、パッケージマネージャがnginxのバージョン管理を処理できるようにする(ソースからコンパイルしない)ことができ、その他のことについて心配する必要はありません。 nginx-extrasのようなコードが脆弱です。

もちろん、オプションを設定server_tokens offして、バージョン番号を非表示にするか、そのフォーマット文字列にもパッチを適用する必要があります。

もちろん「5文字以下」と言いますが、いつでも置き換えることができます。

nginx \ r \ 0

ボブ\ r \ 0 \ r \ 0

最後の2バイトは変更されません。

実際に5文字以上が必要な場合は、server_tokensをオンのままにして、(少し長い)フォーマット文字列を置き換えます。ただし、フォーマット文字列の長さによって課されるその長さには上限があります-1(キャリッジリターン)。

...上記のいずれも意味をなさない場合、または以前にバイナリにパッチを適用したことがない場合は、このアプローチを避けたい場合があります。


1
@PKHunter hm?これの利点は、ゼロからコンパイルする必要なく機能することです。ソースコードは含まれていません。コンパイルされたバイナリに直接パッチを適用しています。
パルティアンショット

1
それはファイル形式をまったく認識していません-それは単にバイトのシーケンスを別のバイトのシーケンスに置き換えるだけです-したがって、実際に置き換えるバイトのシーケンスが本当に置き換えたい文字列にすぎないことを実際に確認することは価値があります、たとえば、サブルーチン内の実行可能コード(かなりありそうもないが、それでも)。
パルティアンショット

1
したがってsed、上記のコマンドを実行するだけで、`which nginx`パーツはバイナリへのパスを返し、sedコマンドはバイト置換を行います。
パルティアンショット

1
回答の後半で説明するnullバイトは、nullバイトで置換を終了する限り、文字列の全長よりも短いヘッダーを使用できることを示しています。en.wikipedia.org/wiki/Null-terminated_string
パルティアショット

1
ああ。はい、それは実行可能ファイルです。また、ファイルへの書き込み権限を持つユーザーである必要もあります。そしてnginx、変更を有効にするために再起動する必要があるとしても、私は驚かないでしょう。言ったことは?他の答えは使用しないでください。私が言っていることのすべてがまだおなじみでなく、/etcディレクトリの目的がわからない場合、このようなハッキングは一種の危険です。
パルティアンショット

2

唯一の方法は、ファイルsrc / http / ngx_http_header_filter_module.cを変更することです。48行目のnginxを別の文字列に変更しました。

nginx設定ファイルでできることは、server_tokensをオフに設定することです。これにより、nginxがバージョン番号を出力できなくなります。

確認するには、curl -I http://vurbu.com/を試してくださいgrepサーバー

戻るはず

Server: Hai

3
まあ、それが唯一の方法ではありません。他の選択肢は他の応答で示されています。
Radko Dinev 2014

1

パルティアンショットの回答を読んだ後、/usr/sbin/nginxバイナリファイルを掘り下げます。次に、ファイルにこれらの3行が含まれていることがわかりました。

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

基本的に、最初の2つはserver_tokens on;ディレクティブ用です(サーバーバージョンが含まれています)。次に、バイナリファイル内のこれらの行に一致するように検索条件を変更します。

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

さらに掘り下げた後、nginxによって生成されたエラーメッセージもこのファイルに含まれていることがわかりました。

<hr><center>nginx</center>

3つあり、1つはバージョンなし、2つはバージョンが含まれています。そこで、次のコマンドを実行して、エラーメッセージ内のnginx文字列を置き換えます。

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

これをありがとう。しかし、内部で実行され、あなたの最初のコマンド/usr/sbinフォルダには、これを得られますsed: can't read is: No such file or directory
Khom Nazid

1

nginxのドキュメントによると、カスタム値または除外さえサポートしています:

Syntax: server_tokens on | off | build | string;

悲しいことに、商用サブスクリプションでのみ:

さらに、商用サブスクリプションの一部として、バージョン1.9.13以降、エラーページの署名と「サーバー」応答ヘッダーフィールドの値は、変数を含む文字列を使用して明示的に設定できます。空の文字列は、「サーバー」フィールドの出力を無効にします。


0

私は投稿が少し古いことを知っていますが、ソースからnginxをコンパイルせずにDebianベースのディストリビューションで機能する簡単な解決策を見つけました。

最初にnginx-extrasパッケージをインストールします

sudo apt install nginx-extras

次に、nginx.confを編集し、サーバーブロック内に次の行を追加して、nginx http headers moreモジュールをロードします

load_module modules / ngx_http_headers_more_filter_module.so;

完了すると、more_set_headersディレクティブとmore_clear_headersディレクティブの両方にアクセスできるようになります。


0

Nginx-extraパッケージは非推奨になりました。

したがって、さまざまなパッケージmore_set_headers 'Server:My Very Own Server'をインストールしようとしたため、次のようになりました。

以下を実行するだけで、サーバーまたはバージョン情報は送信されません

    server_tokens '';

バージョン番号を削除したいだけならこれはうまくいきます

   server_tokens off;

-4

応答のServerヘッダー値について質問していますか?add_headerディレクティブで変更してみることができますが、うまくいくかどうかはわかりません。http://wiki.codemongers.com/NginxHttpHeadersModule


1
はい、サーバーヘッダー。しかし、たとえばlighttpdのように、server.tag = "whatever"しかないようなクリーンな方法はありませんか?add_headerは応答コード
200、204、301、302
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.