zzxworld

移除 Nginx 和 PHP 的版本信息

Nginx 和 PHP 是我目前技术栈中比较重要的成员。线上服务器默认安装好后发起请求服务时,它俩默认会把各自的版本信息带在响应头(Response header)里,一起返回给客户端。这是个潜在的风险和隐患。今天的「诀窍」将分享如何去除它们。

首先来看看正常情况下发起请求时返回的响应头信息。通过以下 curl 命令就可以获取到:

curl -I http://localhost/test.php

该命令在我的测试环境下返回的数据主要如下:

HTTP/1.1 200 OK
Server: nginx/1.22.0
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/7.2.34
Cache-Control: no-cache, private
...

Server 属性和 X-Powered-By 属性值分别暴露了服务端的 Nginx 和 PHP 版本信息。版本信息带来的风险主要源自于一些「互联网漏洞平台」的报告。有人会利用这些报告信息寻找适合搞破坏的软件版本。如果没有精力留意这些风险报告并随时更新有问题的软件版本,输出这些信息意味着是为「破坏份子」提供了便捷。

去掉版本信息并不复杂。先来看看 Nginx。编辑 nginx.conf 文件,在 http 配置段内添加以下配置代码:

server_tokens off;

然后是 PHP。打开 php.ini 文件,找到 expose_php 这个配置项,修改为如下内容:

expose_php = Off

如果这行配置前面有 ; 符号,表示此行被注释了,需要去掉这个符号。然后重启 Nginx 和 PHP-FPM 服务便可生效。再次尝试发起请求,会发现返回的响应头中不再包含相关版本信息。