kuria / request-info
获取当前HTTP请求的信息
Requires
- php: >=7.1
- ext-filter: *
- kuria/url: ^5.0
Requires (Dev)
- kuria/dev-meta: ^0.6
- php-mock/php-mock-phpunit: ^2.1.1
This package is auto-updated.
Last update: 2024-09-07 12:46:02 UTC
README
获取当前HTTP请求的信息。
内容
特性
- 获取请求信息
- 头部
- HTTPS检测
- 客户端IP地址
- 方案
- 方法
- 主机
- 端口
- URL
- 基本目录
- 基本路径
- 路径信息
- 脚本名称
- 支持受信任代理头部(x-forwarded / forwarded)
- 主机验证(包括定义特定的受信任主机或主机模式)
- 可选的HTTP方法覆盖支持
要求
- PHP 7.1+
使用方法
所有配置和值检索都通过静态 Kuria\RequestInfo\RequestInfo
类完成。
配置
受信任的代理
默认情况下,所有代理头部都被忽略。要信任选定的代理头部,请调用 RequestInfo::setTrustedProxies()
并传入适当配置的 TrustedProxies
实例。
<?php use Kuria\RequestInfo\RequestInfo; use Kuria\RequestInfo\TrustedProxies; $trustedProxies = new TrustedProxies( ['192.168.1.10', '192.168.1.20'], // one or more IP adresses or subnets in CIDR notation TrustedProxies::HEADER_FORWARDED // which headers to trust (bit mask) ); RequestInfo::setTrustedProxies($trustedProxies);
选择要信任的头部
受信任的头部是以下常量的位掩码
注意
支持同时信任 Forwarded
和 X-Forwarded-*
头部,但它们必须报告相同的值。不同的值将导致 Kuria\RequestInfo\Exception\HeaderConflictException
。
始终位于受信任代理后面的应用程序
如果您确信一个应用程序始终位于受信任的代理后面,您可以使用 $_SERVER['REMOTE_ADDR']
来代替硬编码的IP地址
<?php use Kuria\RequestInfo\RequestInfo; use Kuria\RequestInfo\Helper\Server; use Kuria\RequestInfo\TrustedProxies; $trustedProxies = new TrustedProxies( [Server::require('REMOTE_ADDR')], TrustedProxies::HEADER_FORWARDED ); RequestInfo::setTrustedProxies($trustedProxies);
受信任的主机
请求主机始终根据标准进行验证。
要进一步限制接受的宿主,请使用以下方法
<?php use Kuria\RequestInfo\RequestInfo; // specific hosts (exact match) RequestInfo::setTrustedHosts([ 'www.example.com', 'cdn.example.com', ]); // host patterns RequestInfo::setTrustedHostPatterns([ '{\w+\.example\.com$}AD', '{example-node-\d+$}AD', ]);
HTTP方法覆盖
默认情况下,忽略 X-HTTP-Method-Override
头部。
如果您需要通过此头部覆盖HTTP方法(例如,由于限制性的防火墙规则),您可以启用其支持
<?php use Kuria\RequestInfo\RequestInfo; RequestInfo::setAllowHttpMethodOverride(true);
重置配置
恢复默认 RequestInfo
配置
<?php use Kuria\RequestInfo\RequestInfo; RequestInfo::reset();
获取请求信息
头部
以数组形式获取所有请求头部。头部名称被转换为小写并用作键。
<?php print_r(RequestInfo::getHeaders());
示例输出
Array ( [host] => localhost:8080 [connection] => keep-alive [cache-control] => max-age=0 [upgrade-insecure-requests] => 1 [user-agent] => Mozilla/5.0 (Example) [accept] => text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 [accept-encoding] => gzip, deflate, br [accept-language] => en-US,en;q=0.9,cs;q=0.8 )
受信任代理检测
检查请求是否来自受信任的代理。
<?php use Kuria\RequestInfo\RequestInfo; if (RequestInfo::isFromTrustedProxy()) { // request is from a trusted proxy }
HTTPS检测
查看请求是否使用HTTPS。
<?php use Kuria\RequestInfo\RequestInfo; if (RequestInfo::isSecure()) { // request uses HTTPS }
客户端IP地址
获取客户端IP地址。
<?php use Kuria\RequestInfo\RequestInfo; var_dump(RequestInfo::getClientIp());
示例输出
string(9) "127.0.0.1"
注意
RequestInfo::getClientIp()
如果客户端IP地址未知(例如,在CLI中),将返回 NULL
。
要获取所有已知客户端IP地址(按最可信到最不可信的顺序排列),请使用 getClientIps()
<?php use Kuria\RequestInfo\RequestInfo; print_r(RequestInfo::getClientIps());
示例输出
Array ( [0] => 20.30.40.50 [1] => 10.20.30.40 )
注意
RequestInfo::getClientIps()
如果客户端IP地址未知(例如,在CLI中),将返回空数组。
方法
获取请求方法。方法名称始终为大写。
另请参阅 HTTP方法覆盖。
<?php use Kuria\RequestInfo\RequestInfo; var_dump(RequestInfo::getMethod());
示例输出
string(3) "GET"
方案
获取请求方案。
<?php use Kuria\RequestInfo\RequestInfo; var_dump(RequestInfo::getScheme());
示例输出
string(4) "https"
主机
获取主机名。
另请参阅 受信任的主机。
<?php use Kuria\RequestInfo\RequestInfo; var_dump(RequestInfo::getHost());
示例输出
string(9) "localhost"
注意
返回的主机名不包括端口号。使用 RequestInfo::getPort()
获取端口号或使用 RequestInfo::getUrl()->getFullHost()
获取带有端口号的主机名(如果它不是标准的)。
端口
获取端口号。
<?php use Kuria\RequestInfo\RequestInfo; var_dump(RequestInfo::getPort());
示例输出
int(80)
URL
获取请求URL。返回一个唯一的 Kuria\Url\Url
实例。
有关更多信息,请参阅 kuria/url 组件。
<?php use Kuria\RequestInfo\RequestInfo; $url = RequestInfo::getUrl(); echo "URL:\t", $url->build(), PHP_EOL, "Scheme:\t", $url->getScheme(), PHP_EOL, "Host:\t", $url->getHost(), PHP_EOL, "Port:\t", $url->getPort(), PHP_EOL, "Path:\t", $url->getPath(), PHP_EOL, "Query:\t", json_encode($url->getQuery()), PHP_EOL;
示例输出
URL: http://localhost:8080/test/index.php/foo?bar=baz Scheme: http Host: localhost Port: 8080 Path: /test/index.php/foo Query: {"bar":"baz"}
基本目录
获取基本目录(如果没有脚本名称,则为)。返回的路径永远不会以 "/" 结尾。
<?php use Kuria\RequestInfo\RequestInfo; var_dump(RequestInfo::getBaseDir());
示例
基本路径
获取基本路径(包括脚本名称,如果有)。返回的路径永不以"/"结尾。
<?php use Kuria\RequestInfo\RequestInfo; var_dump(RequestInfo::getBasePath());
示例
路径信息
获取路径信息。
<?php use Kuria\RequestInfo\RequestInfo; var_dump(RequestInfo::getPathInfo());
示例
脚本名称
获取当前脚本名称。
<?php use Kuria\RequestInfo\RequestInfo; var_dump(RequestInfo::getScriptName());
示例输出
string(18) "./public/index.php"
内部缓存
RequestInfo
类的多数方法会内部缓存它们的返回结果。如果你在读取一些请求信息后操作了$_SERVER
,你需要调用RequestInfo::clearCache()
来清除缓存。