编程

PHP 8.3: 内置 CLI 服务器 $_SERVER['SERVER_SOFTWARE'] 值更新

467 2023-10-30 22:04:00

PHP有一个内置的 CGI 兼容服务器,可在不使用成熟的服务器软件如 Apache、Nginx 或 Caddy 时,测试 PHP 应用。它遵循 RFC 3875,定义了必须的元变量及其特征。在 $_SERVER 超全局变量中暴露给 PHP 应用。

在 PHP 8.3 之前,$_SERVER['SERVER_SOFTWARE'] 的值使用的是 PHP %version% Development Server 格式,违反了 RFC3875 - 4.1.17。这在 PHP 8.3 中得到修复,现在内置服务器遵循 RFC 要求的模式。

- PHP 8.2.0 Development Server
+ PHP/8.3.0 (Development Server)  

请注意,X-Powered-By 的值及其格式并没有改变。

向后兼容性影响

因为 PHP 内置的 CLI 服务器只用于测试,并且 $_SERVER['SERVER_SOFTWARE'] 的值并没有暴露给 HTTP header 或者其他常用输出,该更新不太可能对现有 PHP 应用带来任何影响。

检测 $_SERVER['SERVER_SOFTWARE'] 值来判断应用是不是由内置服务器提供服务的应用可能会受到影响。

 

客观上,确定应用程序是否由 PHP CLI 运行的更好方法是,检测 PHP_SAPI 常量名称是否为 cli-server。之前、前检查过$_SERVER[“SERVER_SOFTWARE”] 值模式的应用程序可以更新如下:

- if (preg_match("/PHP (.*) Development Server/", $_SERVER['SERVER_SOFTWARE']) {
+ if (PHP_SAPI === 'cli-server') {

此外下面的正则表达式匹配了 $_SERVER['SERVER_SOFTWARE'] 值的两种模式:

/^PHP(.*? Development Server|\/.*? \(Development Server\))$/
- if (preg_match("/PHP (.*) Development Server/", $_SERVER['SERVER_SOFTWARE']) {
+ if (preg_match("/^PHP(.*? Development Server|\/.*? \(Development Server\))$/", $_SERVER['SERVER_SOFTWARE']) {