PHP内置服务器下如何获取查询字符串以实现MVC路由?
我之前开发MVC应用时也踩过PHP内置服务器这个小坑,给你几个实用的解决方案,既能兼容内置服务器,也能在Apache上正常运行:
用
$_SERVER['REQUEST_URI']配合parse_url()提取查询字符串
不管是Apache还是PHP内置服务器,$_SERVER['REQUEST_URI']都是可靠存在的,它包含了完整的请求路径和查询参数。我们可以用parse_url()精准提取查询字符串部分:// 获取完整请求URI $requestUri = $_SERVER['REQUEST_URI']; // 提取查询字符串(和$_SERVER['QUERY_STRING']内容一致) $queryString = parse_url($requestUri, PHP_URL_QUERY);比如请求
/products?category=electronics,$queryString就会得到category=electronics,完全满足路由解析的需求。兼容两种环境的判断写法
如果你想保留对QUERY_STRING的优先使用,同时做兼容降级,可以这样写:// 先尝试直接获取QUERY_STRING,不存在则从REQUEST_URI解析 $queryString = isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : parse_url($_SERVER['REQUEST_URI'], PHP_URL_QUERY);要是追求更安全的写法,推荐用
filter_input()来避免直接访问超全局变量的潜在风险:$queryString = filter_input(INPUT_SERVER, 'QUERY_STRING'); if (!$queryString) { $requestUri = filter_input(INPUT_SERVER, 'REQUEST_URI'); $queryString = parse_url($requestUri, PHP_URL_QUERY); }额外提示:路由逻辑可以直接基于
REQUEST_URI
其实很多MVC框架的路由都是直接处理REQUEST_URI的,因为它包含了路径和查询参数的完整信息,不用单独拆分查询字符串。比如你可以直接把$requestUri传给路由解析器,这样不管在哪种服务器环境下都能统一处理,减少环境兼容的麻烦。
为什么会出现这个问题呢?因为PHP内置服务器的$_SERVER变量和Apache的实现略有差异,QUERY_STRING在部分请求场景下(哪怕带?)可能不会被正确设置,而REQUEST_URI是两个环境都标准支持的变量,所以用它来做兼容是最稳妥的。
内容的提问来源于stack exchange,提问作者Andy Mac

