ไม่สามารถกำจัดส่วนหัว X-Powered-By: Express


168

ฉันกำลังรันเซิร์ฟเวอร์บน nodejs ด้วย express ฉันไม่สามารถกำจัดส่วนหัวได้:

X-Powered-By:Express

ฉันสงสัยว่ามีวิธีใดที่จะกำจัดส่วนหัวนี้หรือฉันต้องอยู่กับมันหรือไม่?


@alessioalex คำถามนี้มีจำนวนการดูมากกว่า (ไม่ว่าด้วยเหตุผลใดก็ตามที่เป็นที่นิยมมากกว่า) ดังนั้นเรามาทำซ้ำสิ่งอื่นแทน
Alexei Levenkov

คำตอบ:


247

ใน Express> = 3.0.0rc5:

app.disable('x-powered-by');

นี่คือมิดเดิลแวร์แบบง่ายที่ลบส่วนหัวใน Express เวอร์ชันก่อนหน้า:

app.use(function (req, res, next) {
  res.removeHeader("x-powered-by");
  next();
});

16
ฉันต้องวางมันก่อน app.use(app.router);เพื่อให้มันทำงาน
Pavel Hlobil

2
เหมือนกับ app.set ('x-powered-by', false);
แฮ

1
4.15.2ไม่ได้ทำงานใน @ วิธีการแก้ปัญหาแฮร์ริสที่ใช้app.set()ไม่ได้หลอกลวง
Daniel W.

54

เพียงเพื่อ piggy-back กับคำตอบของ rjack คุณยังสามารถ (เป็นทางเลือก) เพียงแค่เปลี่ยน (set) ส่วนหัว X-powered-by เป็นบางสิ่งที่เย็นกว่า / ที่กำหนดเองเช่นนี้:

app.use(function (req, res, next) {
  res.header("X-powered-by", "Blood, sweat, and tears")
  next()
})

50

ตั้งแต่ Express v3.0.0rc5 การสนับสนุนสำหรับการปิดใช้งานX-Powered-Byส่วนหัวนั้นถูกสร้างขึ้นใน:

var express = require('express');

var app = express();
app.disable('x-powered-by');


10

นี่คือมิดเดิลแวร์ที่มีประโยชน์คุณสามารถเลื่อนเพื่อเปลี่ยน X-Powered-By:

function customHeaders( req, res, next ){
  // Switch off the default 'X-Powered-By: Express' header
  app.disable( 'x-powered-by' );

  // OR set your own header here
  res.setHeader( 'X-Powered-By', 'Awesome App v0.0.1' );

  // .. other headers here

  next()
}

app.use( customHeaders );

// ... now your code goes here

การตั้งค่า X-Powered by ในกรณีนี้จะแทนที่ 'Express' ที่เป็นค่าเริ่มต้นดังนั้นคุณไม่จำเป็นต้องปิดการใช้งานและตั้งค่าใหม่


3

บางทีนี่อาจเห็นได้ชัดสำหรับผู้ใช้ Express ที่มีประสบการณ์มากกว่า แต่สิ่งนี้ใช้ได้สำหรับฉัน:

app.configure(function() {
    app.use(function (req, res, next) {
        res.removeHeader("X-Powered-By");
        next();
    });
});

3

บางครั้งคำตอบที่ด้านบนจะไม่ทำงาน นี่เป็นกรณีของฉัน ฉันมี Express 4.17.1 และไม่มีคำตอบใดที่ใช้งานไม่ได้ ดังนั้นฉันคิดค้นวิธีแก้ปัญหาของตัวเอง:

let app = express();

app.use((req, res, next) => {
  const send = res.send;
  res.send = (data) => {
    res.removeHeader('X-Powered-By');
    return send.call(res, data);
  };

  next();
});

ทำงานกับ Express เวอร์ชั่น 4.16.3 ได้เช่นกัน ไม่มีวิธีแก้ปัญหาอื่นทำงาน
Xyroid

ทำงานให้ฉันด้วยเช่นกันขอบคุณ!
เฟิร์นซ์

2

สำหรับการซ่อน X-Powered By คุณสามารถใช้โหนด .js ห้องสมุดหมวกกันน็อก

ลิงค์สำหรับหมวกนั่นคือ

var helmet = require('helmet');
app.use(helmet.hidePoweredBy());

คุณจะรวมห้องสมุดทั้งหมดสำหรับสิ่งนี้หรือไม่?
Moha อูฐยิ่งใหญ่

ใช่เราต้องใช้หมวกนิรภัย library หากคุณใช้งาน Expressjs fremework คุณสามารถหลีกเลี่ยงไลบรารี่ได้ด้วยโค้ดนี้ app.disable ("x-powered-by");
arjun kori

2

ไม่มีผู้ปฏิบัติงานแก้ไขปัญหามาตรฐานสำหรับฉันเช่นกัน หลังจากค้นหามากฉันพบว่าเราใช้ไฟล์เส้นทางที่มีการเริ่มต้นอินสแตนซ์ใหม่ซึ่งต่อมาถูกเพิ่มในครั้งแรกโดยใช้ app.use เฉพาะเส้นทางในตัวอย่างด่วนใหม่นี้ส่วนหัว X-Powered-By นั้นมีอยู่

มุมมองแบบง่าย ๆ ของปัญหา:

const app = express();
app.disable("x-powered-by");
app.get("/ping", (req, res) => res.send("Pong")); // <-- no X-Powered-By header

const moreRoutes = express();
moreRoutes.get("/ping", (req, res) => res.send("Pong")); // <-- X-Powered-By header still present

app.use("/api/v2", moreRoutes);

โซลูชันเป็นเพียงการสร้างด่วนใหม่แทนที่ตัวอย่างทั้งหมด

const moreRoutes = express.Router();

1

การอ่านรหัสhttps://github.com/visionmedia/express/blob/master/lib/http.js#L72ทำให้ฉันคิดว่าคุณจะต้องอยู่กับมันเพราะมันดูเหมือนจะไม่มีเงื่อนไข

หากคุณมีส่วนหน้า nginx / apache คุณยังสามารถลบส่วนหัวได้ (ด้วย mod_headers สำหรับ apache และส่วนหัว-more สำหรับ nginx)


1
ฉันคิดว่าวิธีการของเว็บเซิร์ฟเวอร์นั้นดีที่สุดแล้ว สิ่งนี้สนับสนุนแนวปฏิบัติที่ดีที่สุด
Dominic

0

removeHeader จะทำงานเฉพาะในมิดเดิลแวร์ของเส้นทางตัวอย่าง coffeescript

fix_headers =  (req, res, next) ->
    res.removeHeader 'X-Powered-By'
    next()

app.get '/posts', fix_headers, (req, res, next) ->
  ...

0

สิ่งนี้ไม่ได้ผลสำหรับฉันยกเว้นสิ่งนี้ (คุณต้องเพิ่มพารามิเตอร์อื่น):

app.use(helmet.hidePoweredBy({ setTo: 'guesswhat' }))

ฉันใช้ Express ^ 4.17

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.