PHP 8.3: 内置 CLI 服务器 $_SERVER['SERVER_SOFTWARE'] 值更新
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']) {