kuria/request-info

获取当前HTTP请求的信息

v1.0.2 2023-07-07 10:02 UTC

This package is auto-updated.

Last update: 2024-09-07 12:46:02 UTC


README

获取当前HTTP请求的信息。

https://travis-ci.cn/kuria/request-info.svg?branch=master

内容

特性

  • 获取请求信息
    • 头部
    • 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);
选择要信任的头部

受信任的头部是以下常量的位掩码

注意

支持同时信任 ForwardedX-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()来清除缓存。