คุณเปลี่ยนส่วนหัวของเซิร์ฟเวอร์ที่ส่งคืนโดย nginx ได้อย่างไร


141

มีตัวเลือกในการซ่อนรุ่นดังนั้นมันจะแสดงเฉพาะ nginx แต่มีวิธีซ่อนเช่นกันดังนั้นมันจะไม่แสดงอะไรเลยหรือเปลี่ยนส่วนหัวหรือไม่


34
btw เพื่อซ่อนรุ่น nginx คุณต้องตั้งค่า 'server_tokens off'
yanchenko

2
หากคุณต้องการลบ nginx จากส่วนหัวคุณอาจต้องการลบออกจากหน้าเปลี่ยนเส้นทางและหน้าข้อผิดพลาด
fabianegli

คำตอบ:


57

เช่นเดียวกับ Apache นี่เป็นการแก้ไขอย่างรวดเร็วไปยังแหล่งที่มา จากCalomel.org :

Server: string เป็นส่วนหัวซึ่งถูกส่งกลับไปยังไคลเอนต์เพื่อแจ้งให้พวกเขาทราบว่าคุณใช้เซิร์ฟเวอร์ http ประเภทใดและรุ่นใด สตริงนี้ถูกใช้โดยสถานที่เช่น Alexia และ Netcraft เพื่อรวบรวมสถิติเกี่ยวกับจำนวนและชนิดของเว็บเซิร์ฟเวอร์ที่ใช้งานบนอินเทอร์เน็ต เพื่อสนับสนุนผู้เขียนและสถิติสำหรับ 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 แก้ไข: Props เพื่อฟลาเวียด้านล่างเพื่อชี้ให้เห็นตัวเลือกใหม่แทน Nginx มาตรฐานHttpHeadersModuleกับง่ามHttpHeadersMoreModule การคอมไพล์โมดูลโมดูลใหม่ยังคงเป็นการแก้ไขด่วนและเหมาะสมถ้าคุณต้องการใช้โมดูลมาตรฐานและจะไม่เปลี่ยนสตริงเซิร์ฟเวอร์บ่อยครั้ง แต่ถ้าคุณต้องการมากกว่านั้น HttpHeadersMoreModule เป็นโครงการที่แข็งแกร่งและให้คุณทำเวทย์มนตร์ดำทุกประเภทด้วยส่วนหัว HTTP ของคุณ


18
ใช้ 'server_tokens off;' เป็นวิธีที่ง่ายที่สุดในการทำ ... ตรวจสอบให้แน่ใจว่าใส่ไว้ในบล็อก "http" หรือ "เซิร์ฟเวอร์"
farinspace

35
นั่นซ่อนหมายเลขรุ่น แต่คำถามคือ "ฉันรู้ว่าฉันสามารถซ่อนหมายเลขรุ่นได้ฉันจะเปลี่ยนหรือลบสตริง" เซิร์ฟเวอร์ "ทั้งหมดได้อย่างไร ไม่มีวิธีการทำเช่นนั้นโดยใช้ nginx นอกกรอบ
joelhardi

การแก้ไขด่วนอื่น (สำหรับรุ่น 1.7.8) เพื่อลบส่วนหัวของเซิร์ฟเวอร์อย่างสมบูรณ์คือ: ใส่เครื่องหมายความคิดเห็นบรรทัดที่ 49 และ 50 (ตรงกับบรรทัดที่ 48, 49 ด้านบน), 280-283 และ 458-469 สำหรับการอ้างอิงในอนาคต: r->headers_out.serverสองคนสุดท้ายมีทั้งถ้าบล็อกชุดที่
pauluss86

3
คำตอบนี้เล็กน้อย แต่เก่าแล้ว คำตอบของ @jamescampbell นั้นมีความชัดเจนมากขึ้นในขณะนี้
jmcollin92

หากคุณวางแผนที่จะใช้วิธีนี้ในการปิดบังเซิร์ฟเวอร์ของคุณคุณอาจต้องการแก้ไขไฟล์ src / http / ngx_http_special_response.c เพื่อเปลี่ยนข้อความแสดงข้อผิดพลาดของเซิร์ฟเวอร์
รองเท้าหุ้มส้น

143

หากคุณใช้ nginx เพื่อให้พร็อกซีแอปพลิเคชันด้านหลังและต้องการให้ back-end โฆษณาServer:ส่วนหัวของตัวเองโดยไม่ต้องเขียนทับ nginx จากนั้นคุณสามารถเข้าไปข้างในserver {…}บทและชุดของคุณ:

proxy_pass_header Server;

ที่จะโน้มน้าวให้ nginx ปล่อยให้ส่วนหัวนั้นอยู่คนเดียวและไม่เขียนค่าที่ตั้งไว้โดยส่วนหลัง


11
หากคุณทำการเปลี่ยนแปลงนี้เนื่องจากเหตุผลด้านความปลอดภัยฉันไม่แน่ใจว่าเพียงพอ หากเซิร์ฟเวอร์ของคุณต้องการส่งคืนข้อความแสดงข้อผิดพลาดส่วนหัวจะยังคงเป็น 'nginx'
KC Baltz

10
แม้ว่าจะสามารถแก้ไขปัญหาได้อย่างง่ายดาย แต่มีสิ่งหนึ่งที่ต้องคำนึงถึง: เมื่อใช้ reverse proxy ไฟล์คงที่จะถูกให้บริการผ่าน nginx ดังนั้นเมื่อคุณเปิดเช่นรูปภาพในแผงไฟ firebug net คุณยังสามารถเห็นเซิร์ฟเวอร์เป็น nginx
dav

IMO นี่คือคำตอบที่ดีที่สุด โซลูชันนี้ไม่จำเป็นต้องมีซอฟต์แวร์เสริมพิเศษและทำงานกับฐาน nginx
กริช

81

อัปเดตล่าสุดเมื่อไม่นานมานี้ดังนั้นนี่คือสิ่งที่ใช้ได้กับฉันใน 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!';

sudo service nginx restartยังไม่ลืมที่จะเริ่มต้นใหม่กับ Nginx


2
มีบางอย่างที่คล้ายกันใน YUM หรือไม่ ยำติดตั้ง nginx-extras ไม่ทำงาน
PKHunter

3
@PKHunter ฉันไม่ได้ลองมันในลิ้นปีศาจของ YUM แต่ฉันจะเห็นสิ่งที่ฉันสามารถหาได้
jamescampbell

2
นี่เป็นคำตอบที่ดีที่สุดอย่างแน่นอน มันควรจะได้รับการยอมรับ นี่เป็นเพียงหนึ่งเดียวที่ตอบทุกกรณี
jmcollin92

6
การตั้งค่าสตริงว่างไปที่ Server: จะทำการระงับส่วนหัวของเซิร์ฟเวอร์:more_set_headers 'Server: ';
Cody Craven

1
ขอบคุณมันใช้งานได้อย่างมีเสน่ห์โดยไม่ต้องทำการคอมไพล์ซ้ำ ทำได้ดีมาก;)
MitchellK

37

ง่าย ๆ แก้ไข /etc/nginx/nginx.conf และลบความคิดเห็นออก

#server_tokens off;

ค้นหาส่วนhttp


3
มันใช้งานได้ดีเมื่อคุณทำสิ่งทั้งหมดที่คุณเห็นเกี่ยวกับเซิร์ฟเวอร์ในข้อมูลส่วนหัวคือ: nginx (ไม่มีหมายเลขรุ่น) ขอบคุณ! : D
jacktrade

13
ผู้เขียนคำถามทราบถึงตัวเลือกนี้อยู่แล้วซึ่งจะลบหมายเลขรุ่นออก แต่ไม่อนุญาตให้คุณปรับแต่งค่าที่ส่งคืนในส่วนหัว "เซิร์ฟเวอร์"
Makotosan

12
สิ่งนี้ไม่ได้ซ่อนทุกอย่าง แต่เฉพาะรุ่นเซิร์ฟเวอร์
ไซต์ดิจิทัล

3
ห้ามลบส่วนหัวการตอบกลับสำหรับเซิร์ฟเวอร์ = nginx
sasha

ฉันคิดว่าการส่งรุ่นของ nginx เป็นปัญหาด้านความปลอดภัย ดังนั้นสำหรับหลาย ๆ คนนี่เป็นทางออกที่ "ดีพอ" นอกจากนี้ยังเป็นที่น่าสังเกตว่าสิ่งนี้จะต้องเข้าไปในแต่ละบล็อกเซิร์ฟเวอร์ในกรณีที่คุณมีบล็อกเซิร์ฟเวอร์สำหรับพอร์ต 80 และ 443
Jeremy

35

ง่ายมาก: เพิ่มบรรทัดเหล่านี้ในส่วนเซิร์ฟเวอร์:

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

10
คุณต้องรวบรวม Nginx กับ 3 โมดูลบุคคล wiki.nginx.org/HttpHeadersMoreModuleที่
Hostmaster

10
บน Ubuntu คุณสามารถติดตั้งnginx-extraเพื่อรับโมดูลนั้นได้
Stan Bondi

11
ถ้าหากเราจะเชื่อ apt-get autoexpansion มันเป็น Nginx-แถมด้วย "s" ในตอนท้าย
Tjunkie

1
หมายเหตุคุณต้องใช้คำนำหน้า "เซิร์ฟเวอร์:" เพื่อแทนที่เซิร์ฟเวอร์ที่มีอยู่: ค่า
elBradford

25

มีโมดูลพิเศษคือ: http://wiki.nginx.org/NginxHttpHeadersMoreModule

โมดูลนี้อนุญาตให้คุณเพิ่มตั้งค่าหรือล้างเอาต์พุตหรือส่วนหัวอินพุตใด ๆ ที่คุณระบุ

นี้เป็นรุ่นที่เพิ่มขึ้นของมาตรฐานส่วนหัวโมดูลเพราะมีสาธารณูปโภคมากขึ้นเช่นการตั้งค่าหรือล้าง "ในตัวส่วนหัว" เหมือนContent-Type, และContent-LengthServer

นอกจากนี้ยังช่วยให้คุณสามารถระบุเกณฑ์รหัสสถานะ 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
Ben Creasy

มีวิธีใดที่จะทำให้โมดูลนี้โดยไม่ต้องคอมไพล์ nginx จากซอร์สสำหรับ Centos 7 อีกหรือไม่?
Prachi

19

ติดตั้ง 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 / อูบุนตู ฯลฯ ด้วยapt-get.)
ขอม Nazid

มันทำงานได้โดยไม่ต้องรวบรวม 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 จะไม่พร้อมใช้งานสำหรับ distro ของคุณและคุณไม่ต้องกังวลเกี่ยวกับสิ่งเพิ่มเติมใด ๆ โค้ดของบางอย่างเช่น nginx-extras จะมีช่องโหว่

แน่นอนคุณจะต้องตั้งค่าตัวเลือกserver_tokens offซ่อนหมายเลขรุ่นหรือแก้ไขชุดรูปแบบสตริงนั้นด้วย

ฉันพูดว่า "ห้าตัวอักษรหรือน้อยกว่า" เพราะแน่นอนคุณสามารถแทนที่:

Nginx \ r \ 0

กับ

bob \ r \ 0 \ r \ 0

ปล่อยให้สองไบต์สุดท้ายไม่เปลี่ยนแปลง

หากคุณต้องการมากกว่าห้าตัวอักษรคุณจะต้องเปิด server_tokens และแทนที่สตริงรูปแบบ (อีกเล็กน้อย) แม้ว่าจะมีขีด จำกัด สูงสุดของความยาวนั้นที่กำหนดโดยความยาวของสตริงรูปแบบ - 1 (สำหรับ การคืนรถ)

... หากไม่มีสิ่งใดที่กล่าวมาข้างต้นเหมาะสมกับคุณหรือคุณไม่เคยปรับปรุงเลขฐานสองมาก่อนคุณอาจต้องการหลีกเลี่ยงวิธีนี้


1
@PKHunter หือ? ข้อดีของมันคือมันทำงานได้โดยไม่ต้องคอมไพล์ตั้งแต่เริ่มต้น ไม่มีซอร์สโค้ดเกี่ยวข้อง มันกำลังแก้ไขไบนารีที่คอมไพล์โดยตรง
คู่ปรับ Shot

1
ไม่ทราบถึงรูปแบบไฟล์เลย - เพียงแค่เปลี่ยนลำดับของไบต์ด้วยลำดับไบต์ที่แตกต่างกัน - ดังนั้นจึงควรตรวจสอบว่าลำดับของไบต์ที่คุณแทนที่จริง ๆ เป็นเพียงสตริงที่คุณต้องการแทนที่และไม่คุ้มค่า พูดรหัสปฏิบัติการในรูทีนย่อย (ซึ่งไม่น่าจะสวย แต่ก็ยัง)
ต่อสู้ยิง

1
ดังนั้นคุณเพียงแค่เรียกใช้sedคำสั่งดังกล่าวข้างต้น`which nginx`ส่วนที่ส่งกลับเส้นทางไปยังไบนารีและsedคำสั่งทำการแทนที่ไบต์
คู่ปรับ Shot

1
ไบต์ที่ระบุในภายหลังในคำตอบอ้างอิงถึงข้อเท็จจริงที่ว่าคุณสามารถใช้ส่วนหัวที่สั้นกว่าความยาวเต็มของสตริงได้ตราบใดที่คุณสิ้นสุดการแทนที่ด้วยไบต์ว่าง en.wikipedia.org/wiki/Null-terminated_string
Parthian Shot

1
อา. ใช่มันเป็นปฏิบัติการ และคุณจะต้องเป็นผู้ใช้ที่มีสิทธิ์เขียนไฟล์ และฉันจะไม่แปลกใจถ้าคุณต้องการเริ่มต้นใหม่nginxเพื่อให้การเปลี่ยนแปลงมีผล ทั้งหมดที่กล่าวมา? ฉันขอให้คุณอย่าใช้คำตอบอย่างใดอย่างหนึ่ง หากทุกสิ่งที่ฉันพูดยังไม่คุ้นเคยกับคุณและคุณไม่รู้ว่า/etcไดเรกทอรีนี้มีไว้เพื่ออะไรแฮ็คแบบนี้มีอันตราย
คู่ปรับ Shot

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;directive (รวมเวอร์ชันเซิร์ฟเวอร์) จากนั้นฉันจะเปลี่ยนเกณฑ์การค้นหาเพื่อจับคู่บรรทัดเหล่านั้นภายในไฟล์ไบนารี

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
Khom Nazid

1

ตามเอกสารของ nginx รองรับค่าที่กำหนดเองหรือแม้แต่การยกเว้น:

Syntax: server_tokens on | off | build | string;

แต่น่าเศร้าที่มีการสมัครรับข้อมูลเชิงพาณิชย์เท่านั้น:

นอกจากนี้ในฐานะส่วนหนึ่งของการสมัครสมาชิกเชิงพาณิชย์ของเราเริ่มต้นจากเวอร์ชัน 1.9.13 ลายเซ็นต์บนหน้าข้อผิดพลาดและค่าฟิลด์ส่วนหัวการตอบกลับ“ เซิร์ฟเวอร์” สามารถตั้งค่าได้อย่างชัดเจนโดยใช้สตริงที่มีตัวแปร สตริงว่างปิดใช้งานการปล่อยฟิลด์“ เซิร์ฟเวอร์”


0

ฉันรู้ว่าโพสต์นั้นค่อนข้างเก่า แต่ฉันได้พบวิธีแก้ปัญหาที่ใช้งานได้กับการแจกจ่ายแบบ Debian โดยไม่ต้องรวบรวม nginx จากแหล่งที่มา

ขั้นแรกให้ติดตั้งแพคเกจ nginx-extras

sudo apt ติดตั้ง nginx-extras

จากนั้นโหลดส่วนหัว http http ของโมดูลเพิ่มเติมโดยการแก้ไข nginx.conf และเพิ่มบรรทัดต่อไปนี้ภายในบล็อกเซิร์ฟเวอร์

load_module modules / ngx_http_headers_more_filter_module.so;

เมื่อเสร็จแล้วคุณจะสามารถเข้าถึงทั้งคำสั่ง more_set_headers และ more_clear_headers


0

แพ็คเกจเสริม Nginx เลิกใช้แล้วในขณะนี้

ดังนั้นต่อไปนี้ทำงานให้ฉันได้ในขณะที่ฉันพยายามติดตั้งแพ็คเกจต่างๆ more_set_headers 'เซิร์ฟเวอร์: เซิร์ฟเวอร์ส่วนตัวของฉันมาก';

คุณสามารถทำสิ่งต่อไปนี้และจะไม่มีการส่งข้อมูลเซิร์ฟเวอร์หรือรุ่นกลับ

    server_tokens '';

หากคุณเพียงแค่ต้องการลบหมายเลขรุ่นที่ใช้งานได้

   server_tokens off;

-4

คุณกำลังถามเกี่ยวกับค่าส่วนหัวของเซิร์ฟเวอร์ในการตอบสนองหรือไม่? คุณสามารถลองเปลี่ยนมันด้วยคำสั่ง add_header แต่ฉันไม่แน่ใจว่ามันจะทำงาน http://wiki.codemongers.com/NginxHttpHeadersModule


1
ใช่ส่วนหัวของเซิร์ฟเวอร์ แต่ไม่มีวิธีที่สะอาดกว่าเช่นใน lighttpd เช่นที่ฉันเพิ่งมี server.tag = "อะไรก็ตาม"? add_header ใช้งานได้กับรหัสการตอบสนอง 200, 204, 301, 302 หรือ 304 เท่านั้นดังนั้นหากเซิร์ฟเวอร์จะทำอย่างใดอย่างหนึ่ง 500 มันจะไม่ทำงาน
daniels
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.