You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Next.js自定义服务器中移除X-Powered-By响应头

移除Next.js响应头中的X-Powered-By字段

我之前也碰到过这个问题,用express自定义服务器的disable('x-powered-by')没生效,后来发现是配置顺序或者Next.js本身的处理逻辑导致的。下面给你几个靠谱的解决方案,按推荐程度排序:

方案一:通过next.config.js配置(无需自定义服务器,推荐)

不管你用的是Pages Router还是App Router,都可以直接在项目根目录的next.config.js里添加headers配置,全局移除这个响应头:

/** @type {import('next').NextConfig} */
const nextConfig = {
  async headers() {
    return [
      {
        // 匹配所有路由路径
        source: '/:path*',
        headers: [
          {
            key: 'X-Powered-By',
            value: undefined, // 设置为undefined会直接移除该头
          },
        ],
      },
    ];
  },
};

module.exports = nextConfig;

修改完之后重启开发服务器,再检查响应头就会发现X-Powered-By已经不见了。

方案二:使用Middleware(App Router优先推荐,更灵活)

如果你的项目用了App Router,或者需要更精细的路由控制,Middleware是更好的选择。在app目录下创建middleware.ts(或.js)文件:

import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';

export function middleware(request: NextRequest) {
  // 获取默认响应对象
  const response = NextResponse.next();
  // 移除X-Powered-By头
  response.headers.delete('X-Powered-By');
  return response;
}

// 配置匹配所有路径
export const config = {
  matcher: '/:path*',
};

这个方法的优势是可以根据不同的请求路径、方法等条件动态处理响应头,非常灵活。

方案三:修复自定义服务器的配置(如果坚持使用自定义服务器)

如果你一定要用express自定义服务器,那得注意配置的顺序——必须先禁用x-powered-by,再处理Next.js的请求,否则Next.js的内部处理可能会重新添加这个头。正确的代码示例:

const express = require('express');
const next = require('next');

const dev = process.env.NODE_ENV !== 'production';
const app = next({ dev });
const handle = app.getRequestHandler();

app.prepare().then(() => {
  const server = express();

  // 关键:先禁用x-powered-by
  server.disable('x-powered-by');

  // 再处理所有Next.js请求
  server.all('*', (req, res) => {
    return handle(req, res);
  });

  server.listen(3000, (err) => {
    if (err) throw err;
    console.log('> Ready on http://localhost:3000');
  });
});

之前你的方法没生效,大概率是把server.disable('x-powered-by')放在了处理请求的代码之后,调整顺序就可以解决。

总的来说,官方更推荐前两种方案,因为自定义服务器会增加项目复杂度,而且在Next.js的新特性(比如App Router)支持上会有局限。

内容的提问来源于stack exchange,提问作者Farnabaz

火山引擎 最新活动