request()->server()直接映射php原生$_server数组,返回原始未过滤字符串,常用可靠键包括request_method、http_host、request_uri、query_string、content_length,但不可用于权限校验或替代语义化方法如request()->method()。

request()->server() 读取的是 $_SERVER 超全局数组
它不是封装后的“语义化”方法,而是直接映射 PHP 原生 $_SERVER —— 所以你能拿到的键,完全取决于 Web 服务器(Nginx/Apache)和 PHP SAPI 如何填充它。比如 REQUEST_METHOD、HTTP_HOST、SERVER_PORT 都是常见且稳定的;但像 HTTP_X_FORWARDED_FOR 这种依赖代理配置的字段,可能为空或被伪造。
调用形式固定:request()->server('KEY'),第二个参数是默认值(可选),避免未定义键触发 notice:
request()->server('SERVER_NAME', 'localhost')
注意:它不做过滤、不转义、不解析,就是原样返回字符串 —— 所以若用于前端展示或日志输出,自己加 htmlspecialchars()。
哪些 server 键在 TP6 中最常用且可靠
-
REQUEST_METHOD:唯一可信的原始 HTTP 方法来源,比request()->method(true)更稳(旧版 TP6.0.0~6.0.3 中后者有 bug) -
HTTP_HOST或SERVER_NAME:拼接完整 URL 时用前者(含端口),后者仅主机名(可能不准确) -
REQUEST_URI:带查询参数的路径部分,如/user/list?id=1;注意它不含协议和域名 -
QUERY_STRING:GET 参数原始字符串,用于统计参数字节数,strlen(request()->server('QUERY_STRING'))比request()->param()准确得多 -
CONTENT_LENGTH:整个请求体长度(单位字节),multipart 文件上传场景下比getRawContent()更靠谱(后者在 multipart 中常为空)
容易踩的坑:别把 server() 当万能兜底
它无法替代业务层逻辑判断:
-
HTTP_REFERER可被客户端随意篡改,不能用于权限校验或跳转白名单 -
HTTPS在反向代理后常为空,应优先用REQUEST_SCHEME(PHP 5.6+)判断协议 -
REMOTE_ADDR在 Nginx + proxy_pass 后是上游 IP,需配合X-Real-IP或X-Forwarded-For(但后者可伪造,需可信代理配置) - 某些键如
PATH_INFO在 CGI/FastCGI 模式下可能缺失,此时应 fallback 到request()->pathinfo()
真正关键的一点:server() 返回的是「服务器收到的原始输入」,不是「框架理解后的语义结果」——比如 REQUEST_METHOD 永远是 POST,哪怕你表单里写了 _method=DELETE;要拿语义方法,还是得用 request()->method(false)。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











