Làm thế nào để bạn thay đổi tiêu đề máy chủ được nginx trả về?


141

Có một tùy chọn để ẩn phiên bản để nó sẽ chỉ hiển thị nginx, nhưng có cách nào để ẩn quá để nó không hiển thị bất cứ điều gì hoặc thay đổi tiêu đề?


34
btw, để ẩn phiên bản nginx, bạn cần đặt 'server_tokens tắt'.
yanchenko

2
Nếu bạn quan tâm đến việc xóa nginx khỏi tiêu đề, bạn cũng có thể muốn xóa nó khỏi các trang chuyển hướng và trang lỗi.
fabianegli

Câu trả lời:


57

Giống như Apache, đây là một chỉnh sửa nhanh chóng về nguồn và biên dịch lại. Từ Calomel.org :

Chuỗi máy chủ: là tiêu đề được gửi lại cho máy khách để cho họ biết loại máy chủ http nào bạn đang chạy và có thể là phiên bản nào. Chuỗi này được sử dụng bởi những nơi như Alexia và Netcraft để thu thập số liệu thống kê về số lượng và loại máy chủ web đang hoạt động trên Internet. Để hỗ trợ tác giả và số liệu thống kê cho Nginx, chúng tôi khuyên bạn nên giữ chuỗi này. Nhưng, để bảo mật, bạn có thể không muốn mọi người biết bạn đang chạy gì và bạn có thể thay đổi điều này trong mã nguồn. Chỉnh sửa tệp nguồn src/http/ngx_http_header_filter_module.c khi nhìn vào dòng 48 và 49. Bạn có thể thay đổi Chuỗi thành bất cứ điều gì bạn muốn.

## 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;

Chỉnh sửa tháng 3 năm 2011: Đạo cụ cho Flavius ​​bên dưới để chỉ ra một tùy chọn mới, thay thế httpHeadersModule tiêu chuẩn của Nginx bằng httpHeadersMoreModule rẽ nhánh . Biên dịch lại mô-đun tiêu chuẩn vẫn là cách khắc phục nhanh và có ý nghĩa nếu bạn muốn sử dụng mô-đun chuẩn và sẽ không thay đổi chuỗi máy chủ thường xuyên. Nhưng nếu bạn muốn nhiều hơn thế, thì httpHeadersMoreModule là một dự án mạnh mẽ và cho phép bạn thực hiện tất cả các loại phép thuật đen thời gian chạy với các tiêu đề HTTP của bạn.


18
sử dụng 'server_tokens tắt;' cho đến nay là cách dễ nhất để làm điều đó ... hãy đảm bảo đặt nó trong một khối "http" hoặc "máy chủ"
khoảng cách

35
Điều đó ẩn số phiên bản, nhưng câu hỏi là "Tôi biết tôi có thể ẩn số phiên bản, làm cách nào để thay đổi hoặc xóa toàn bộ chuỗi 'Máy chủ'?" Không có cách nào để làm điều đó bằng cách sử dụng nginx ngoài luồng.
joelhardi

Một cách khắc phục nhanh khác (đối với phiên bản 1.7.8) để loại bỏ hoàn toàn tiêu đề máy chủ là: nhận xét các dòng 49 và 50 (tương ứng với các dòng 48, 49 ở trên), 280-283 và 458-469. Để tham khảo trong tương lai: hai cái cuối cùng là cả hai khối if được đặt r->headers_out.server.
pauluss86

3
Câu trả lời này là một chút nhưng cũ. Câu trả lời của @jamescampbell là hiệu quả hơn bây giờ.
jmcollin92

Nếu bạn dự định sử dụng phương pháp này để che dấu máy chủ của mình, bạn cũng có thể muốn chỉnh sửa tệp src / http / ngx_http_special_response.c để thay đổi thông báo lỗi của máy chủ.
Brogan

143

Nếu bạn đang sử dụng nginx để ủy quyền một ứng dụng back-end và muốn back-end quảng cáo Server:tiêu đề của riêng mình mà không cần ghi đè lên nó, thì bạn có thể vào bên trong khổ server {…}thơ của mình và đặt:

proxy_pass_header Server;

Điều đó sẽ thuyết phục nginx để lại tiêu đề đó một mình và không viết lại giá trị được đặt bởi back-end.


11
Nếu bạn thực hiện thay đổi này vì lý do bảo mật, tôi không chắc điều này là đủ. Nếu máy chủ của bạn cần trả về thông báo lỗi, tiêu đề vẫn sẽ là 'nginx'
KC Baltz

10
mặc dù điều này giải quyết vấn đề một cách dễ dàng, tuy nhiên có một điều cần tính đến: khi sử dụng proxy ngược, các tệp tĩnh đang được cung cấp qua nginx, vì vậy khi bạn mở ví dụ: hình ảnh trong bảng điều khiển mạng fireorms bạn vẫn có thể thấy máy chủ là nginx
dav

IMO, đây là câu trả lời tốt nhất. Giải pháp này không yêu cầu bất kỳ phần mở rộng phần mềm đặc biệt nào và hoạt động với nginx cơ sở.
Kris

81

Bản cập nhật cuối cùng cách đây một thời gian, vì vậy đây là những gì hoạt động với tôi trên Ubuntu:

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

Sau đó thêm hai dòng sau vào httpphần của nginx.conf, thường nằm ở /etc/nginx/nginx.conf:

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

Ngoài ra, đừng quên khởi động lại nginx với sudo service nginx restart.


2
Có điều gì tương tự trên YUM không? yum cài đặt nginx-bổ sung không hoạt động.
PKHunter

3
@PKHunter Tôi chưa thử nó bằng lưỡi YUM của quỷ nhưng tôi sẽ thấy những gì tôi có thể tìm thấy.
jamescampbell

2
Đây chắc chắn là câu trả lời tốt nhất. Nó nên được chấp nhận. Đây chỉ là một câu trả lời cho tất cả các trường hợp.
jmcollin92

6
Đặt chuỗi trống thành Máy chủ: sẽ chặn tiêu đề máy chủ:more_set_headers 'Server: ';
Cody Craven

1
Cảm ơn bạn điều này hoạt động như một nét duyên dáng mà không cần biên dịch lại bất kỳ loại nào. Làm tốt lắm;)
MitchellK

37

Đơn giản, chỉnh sửa /etc/nginx/nginx.conf và xóa nhận xét khỏi

#server_tokens off;

Tìm kiếm phần http .


3
Điều này hoạt động tốt, một khi bạn làm điều này tất cả những gì bạn có thể thấy về máy chủ trên thông tin tiêu đề là: nginx (không có số phiên bản) Cảm ơn! : D
jacktrade

13
Tác giả của câu hỏi đã biết về tùy chọn này, loại bỏ số phiên bản, nhưng không cho phép bạn tùy chỉnh giá trị được trả về trong tiêu đề "máy chủ".
Makotosan

12
Điều này không che giấu mọi thứ, nhưng chỉ có phiên bản máy chủ.
Trang web kỹ thuật số

3
Không xóa tiêu đề phản hồi cho Server = nginx
sasha

Tôi nghĩ rằng việc vượt qua phiên bản nginx là một mối quan tâm bảo mật. Vì vậy, đối với nhiều người, đây là một giải pháp "đủ tốt". Ngoài ra, điều đáng chú ý là điều này sẽ phải đi vào từng khối máy chủ, trong trường hợp bạn có một khối máy chủ cho cổng 80 và 443.
Jeremy

35

Rất đơn giản: Thêm các dòng này vào phần máy chủ:

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

10
Bạn cần phải biên dịch nginx với thứ 3 mô-đun bên wiki.nginx.org/HttpHeadersMoreModule cho rằng
hostmaster

10
Trên Ubuntu bạn có thể cài đặt nginx-extrađể có được mô-đun đó.
Stan Bondi

11
nếu chúng ta tin vào khả năng mở rộng tự động của apt-get, thì đó là phần mở rộng nginx với "s" ở cuối
Tjunkie

1
Lưu ý, bạn cần tiền tố "Máy chủ:" để ghi đè giá trị Máy chủ: hiện có.
elBradford

25

Có một mô-đun đặc biệt: http://wiki.nginx.org/NginxHttpHeadersMoreModule

Mô-đun này cho phép bạn thêm, đặt hoặc xóa bất kỳ tiêu đề đầu ra hoặc đầu vào nào mà bạn chỉ định.

Đây là một phiên bản nâng cao của tiêu chuẩn tiêu đề mô-đun vì nó cung cấp các tiện ích giống như đặt lại hoặc thanh toán bù trừ "BUILTIN tiêu đề" như Content-Type, Content-Length, vàServer .

Nó cũng cho phép bạn chỉ định một tùy chọn tiêu chuẩn mã trạng thái HTTP bằng cách sử dụng -stùy chọn và một tùy chọn tiêu chí kiểu nội dung bằng cách sử dụng -ttùy chọn trong khi sửa đổi các tiêu đề đầu ra với more_set_headersmore_clear_headers chỉ thị ...


3
Biên dịch nginx với--add-module=/path-to-headers-more-nginx-module
mate64

Có vẻ như điều này đã được chuyển đến OpenResty: github.com/openresty/headers-more-nginx-module#readme
Ben Creasy

Có cách nào để có được mô-đun này mà không phải biên dịch lại nginx từ nguồn cho Centos 7 không?
Prachi

19

Cài đặt Nginx Extras

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

Chi tiết máy chủ có thể được xóa khỏi phản hồi bằng cách thêm hai dòng sau vào nginx.conf (trong phần http)

more_clear_headers Server;
server_tokens off;

Một, đây là những gì @jamescampbell đã đề cập ở trên. Thứ hai, điều này đòi hỏi Nginx phải được biên dịch từ nguồn ( yum install nginx-extraskhông hoạt động - Tôi cho rằng điều này hoạt động trên Debia / Ubuntu, v.v. apt-get)
Khom Nazid

Nó hoạt động mà không có nginx được biên dịch từ nguồn. Bạn chỉ cần tải mô-đun: ngx_http_headftimemore_filter_module từ nginx.conf
lạch cạch

sau khi chạy "apt-get install nginx-extend", nó đã hạ cấp phiên bản nginx của tôi từ 1.16 xuống 1.14
Grayaii

15

Nếu bạn ổn với việc chỉ thay đổi tiêu đề thành một chuỗi khác năm chữ cái trở xuống, bạn có thể chỉ cần vá nhị phân.

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

Mà, như một giải pháp, có một vài lợi thế đáng chú ý. Cụ thể, bạn có thể cho phép phiên bản nginx của mình được xử lý bởi người quản lý gói (vì vậy, không biên dịch từ nguồn) ngay cả khi nginx-bổ sung không có sẵn cho bản phân phối của bạn và bạn không cần phải lo lắng về bất kỳ bổ sung nào mã của một cái gì đó như nginx-bổ sung dễ bị tổn thương.

Tất nhiên, bạn cũng sẽ muốn đặt tùy chọn server_tokens off , để ẩn số phiên bản hoặc vá chuỗi định dạng đó.

Tôi nói "năm chữ cái hoặc ít hơn" bởi vì tất nhiên bạn luôn có thể thay thế:

nginx \ r \ 0

với

bob \ r \ 0 \ r \ 0

để lại hai byte cuối cùng không thay đổi.

Nếu bạn thực sự muốn có nhiều hơn năm ký tự, bạn sẽ muốn bật server_tokens và thay thế chuỗi định dạng (dài hơn một chút), mặc dù một lần nữa có giới hạn trên về độ dài được áp đặt bởi độ dài của chuỗi định dạng - 1 (đối với vận chuyển trở lại).

... Nếu không có điều nào ở trên có ý nghĩa với bạn, hoặc bạn chưa bao giờ vá nhị phân trước đó, bạn có thể muốn tránh xa phương pháp này.


1
@PKHunter hm? Ưu điểm của việc này là nó hoạt động mà không phải biên dịch từ đầu. Không có mã nguồn liên quan. Đó là bản vá nhị phân được biên dịch trực tiếp.
Bắn Parthian

1
Hoàn toàn không biết định dạng tệp - nó chỉ thay thế một chuỗi byte bằng một chuỗi byte khác - vì vậy, thật đáng để xác minh rằng chuỗi byte bạn đang thay thế thực sự chỉ là chuỗi bạn muốn thay thế chứ không phải , giả sử, mã thực thi trong chương trình con (điều này khá khó xảy ra, nhưng vẫn còn).
Bắn Parthian

1
Vì vậy, bạn chỉ cần chạy sedlệnh trên, `which nginx`phần này trả về đường dẫn đến nhị phân và sedlệnh thực hiện thay thế byte.
Bắn Parthian

1
Các byte null được đề cập sau trong câu trả lời đề cập đến thực tế là bạn có thể sử dụng các tiêu đề ngắn hơn toàn bộ chiều dài của chuỗi miễn là bạn kết thúc việc thay thế bằng một byte null. vi.wikipedia.org/wiki/Null-terminated_opes
Parthian Shot

1
Ah. Vâng, nó là thực thi. Và bạn cũng cần phải là người dùng có quyền ghi vào tệp. Và tôi sẽ không ngạc nhiên nếu bạn cần khởi động lại nginxđể những thay đổi có hiệu lực. Tất cả những gì đã nói? Tôi đề nghị bạn không sử dụng một trong những câu trả lời khác. Nếu tất cả những điều tôi nói không quen thuộc với bạn và bạn không biết /etcthư mục đó dùng để làm gì, thì một vụ hack như thế này là nguy hiểm.
Bắn Parthian

2

Cách duy nhất là sửa đổi tệp src / http / ngx_http_header_filter_module.c. Tôi đã thay đổi nginx trên dòng 48 thành một chuỗi khác.

Những gì bạn có thể làm trong tệp cấu hình nginx là đặt server_tokens tắt . Điều này sẽ ngăn nginx in số phiên bản.

Để kiểm tra mọi thứ, hãy thử curl -I http://vurbu.com/ | máy chủ grep

Nó sẽ trở lại

Server: Hai

3
Chà, đó không phải là cách duy nhất. Các lựa chọn thay thế khác đã được thể hiện trong các phản ứng khác.
Radko Dinev

1

Sau khi tôi đọc câu trả lời của Parthian Shot, tôi đào sâu vào /usr/sbin/nginxtệp nhị phân. Sau đó tôi phát hiện ra rằng tập tin chứa ba dòng này.

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

Về cơ bản, hai trong số chúng có nghĩa là server_tokens on;chỉ thị (Bao gồm phiên bản máy chủ). Sau đó, tôi thay đổi tiêu chí tìm kiếm để khớp với các dòng trong tệp nhị phân.

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

Sau khi tôi đào xa hơn, tôi phát hiện ra rằng thông báo lỗi do nginx tạo ra cũng được bao gồm trong tệp này.

<hr><center>nginx</center>

Có ba trong số họ, một không có phiên bản, hai trong số đó bao gồm phiên bản. Vì vậy, tôi chạy lệnh sau để thay thế chuỗi nginx trong thông báo lỗi.

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

Cảm ơn vì điều đó. Nhưng lệnh đầu tiên của bạn được thực thi trong /usr/sbinthư mục mang lại điều này:sed: can't read is: No such file or directory
Khom Nazid

1

Theo tài liệu nginx, nó hỗ trợ các giá trị tùy chỉnh hoặc thậm chí loại trừ:

Syntax: server_tokens on | off | build | string;

nhưng thật đáng buồn chỉ với một thuê bao thương mại :

Ngoài ra, là một phần của đăng ký thương mại của chúng tôi, bắt đầu từ phiên bản 1.9.13, chữ ký trên các trang lỗi và giá trị trường tiêu đề phản hồi của Máy chủ trực tuyến có thể được đặt rõ ràng bằng cách sử dụng chuỗi có biến. Một chuỗi trống sẽ vô hiệu hóa phát xạ của trường Server Server.


0

Tôi biết bài đăng này hơi cũ, nhưng tôi đã tìm thấy một giải pháp dễ dàng hoạt động trên bản phân phối dựa trên Debian mà không cần biên dịch nginx từ nguồn.

Lần đầu tiên cài đặt gói nginx-ngoại vi

sudo apt cài đặt nginx-bổ sung

Sau đó tải mô-đun nginx http thêm mô-đun bằng cách chỉnh sửa nginx.conf và thêm dòng sau vào khối máy chủ

mô-đun load_module / ngx_http_headftimemore_filter_module.so;

Khi đã xong, bạn sẽ có quyền truy cập vào cả chỉ thị more_set_headers và more_clear_headers.


0

Gói Nginx-thêm hiện không được chấp nhận.

Do đó, sau đây đã làm việc cho tôi khi tôi đã thử cài đặt các gói khác nhau more_set_headers 'Server: My Very own Server';

Bạn chỉ có thể làm như sau và không có thông tin máy chủ hoặc phiên bản nào được gửi lại

    server_tokens '';

nếu bạn chỉ muốn xóa số phiên bản thì nó hoạt động

   server_tokens off;

-4

Bạn đang hỏi về giá trị tiêu đề Máy chủ trong phản hồi? Bạn có thể thử thay đổi điều đó bằng một lệnh add_header, nhưng tôi không chắc liệu nó có hoạt động không. http://wiki.codemongers.com/NginxHttpHeadersModule


1
vâng, tiêu đề máy chủ. nhưng không có cách nào sạch hơn như trên lighttpd, ví dụ như tôi chỉ có server.tag = "sao cũng được"? add_header chỉ hoạt động đối với các mã phản hồi 200, 204, 301, 302 hoặc 304, vì vậy nếu máy chủ bằng cách nào đó sẽ thực hiện 500 thì nó sẽ không hoạt động
daniels
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.