On this page
Reference
Server Request Filters
New Feature
Available since version 2.11.1
Server request filters allow you to modify the initial state of a generated ServerRequest
instance as returned from Laminas\Diactoros\ServerRequestFactory::fromGlobals()
.
Common use cases include:
- Generating and injecting a request ID.
- Modifying the request URI based on headers provided (e.g., based on the
X-Forwarded-Host
orX-Forwarded-Proto
headers).
FilterServerRequestInterface
A request filter implements Laminas\Diactoros\ServerRequestFilter\FilterServerRequestInterface
:
namespace Laminas\Diactoros\ServerRequestFilter;
use Psr\Http\Message\ServerRequestInterface;
interface FilterServerRequestInterface
{
public function __invoke(ServerRequestInterface $request): ServerRequestInterface;
}
Implementations
We provide the following implementations:
DoNotFilter
: returns the provided$request
verbatim.FilterUsingXForwardedHeaders
: if the originating request comes from a trusted proxy, examines theX-Forwarded-*
headers, and returns the request instance with a URI instance that reflects those headers.
DoNotFilter
This filter returns the $request
argument back verbatim when invoked.
FilterUsingXForwardedHeaders
Servers behind a reverse proxy need mechanisms to determine the original URL requested.
As such, reverse proxies have provided a number of mechanisms for delivering this information, with the use of X-Forwarded-*
headers being the most prevalant.
These include:
X-Forwarded-Host
: the originalHost
header value.X-Forwarded-Port
: the original port included in theHost
header value.X-Forwarded-Proto
: the original URI scheme used to make the request (e.g., "http" or "https").
Laminas\Diactoros\ServerRequestFilter\FilterUsingXForwardedHeaders
provides named constructors for choosing whether to never trust proxies, always trust proxies, or choose wich proxies and/or headers to trust in order to modify the URI composed in the request instance to match the original request.
These named constructors are:
FilterUsingXForwardedHeadersFactory::trustProxies(string[] $proxyCIDRList, string[] $trustedHeaders = FilterUsingXForwardedHeaders::X_FORWARDED_HEADERS): void
: when this method is called, only requests originating from the trusted proxy/ies will be considered, as well as only the headers specified. Proxies may be specified by IP address, or using CIDR notation for subnets; both IPv4 and IPv6 are accepted. The special string "*" will be translated to two entries,0.0.0.0/0
and::/0
.FilterUsingXForwardedHeaders::trustAny(): void
: when this method is called, the filter will trust requests from any origin, and use any of the above headers to modify the URI instance. It is functionally equivalent toFilterUsingXForwardedHeaders::trustProxies(['*'])
.FilterUsingXForwardedHeaders::trustReservedSubnets(): void
: when this method is called, the filter will trust requests made from reserved, private subnets. It is functionally equivalent toFilterUsingXForwardedHeaders::trustProxies()
with the following elements in the$proxyCIDRList
:- 10.0.0.0/8
- 127.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
- ::1/128 (IPv6 localhost)
- fc00::/7 (IPv6 private networks)
- fe80::/10 (IPv6 local-link addresses)
Internally, the filter checks the REMOTE_ADDR
server parameter (as retrieved from getServerParams()
) and compares it against each proxy listed; the first to match indicates trust.
Constants
The FilterUsingXForwardedHeaders
defines the following constants for use in specifying various headers:
HEADER_HOST
: corresponds toX-Forwarded-Host
.HEADER_PORT
: corresponds toX-Forwarded-Port
.HEADER_PROTO
: corresponds toX-Forwarded-Proto
.
Example usage
Trusting all X-Forwarded-*
headers from any source:
$filter = FilterUsingXForwardedHeaders::trustAny();
Trusting only the X-Forwarded-Host
header from any source:
$filter = FilterUsingXForwardedHeaders::trustProxies('0.0.0.0/0', [FilterUsingXForwardedHeaders::HEADER_HOST]);
Trusting the X-Forwarded-Host
and X-Forwarded-Proto
headers from a single Class C subnet:
$filter = FilterUsingXForwardedHeaders::trustProxies(
'192.168.1.0/24',
[FilterUsingXForwardedHeaders::HEADER_HOST, FilterUsingXForwardedHeaders::HEADER_PROTO]
);
Trusting the X-Forwarded-Host
header from either a Class A or a Class C subnet:
$filter = FilterUsingXForwardedHeaders::trustProxies(
['10.1.1.0/16', '192.168.1.0/24'],
[FilterUsingXForwardedHeaders::HEADER_HOST, FilterUsingXForwardedHeaders::HEADER_PROTO]
);
Trusting any X-Forwarded-*
header from any private subnet:
$filter = FilterUsingXForwardedHeaders::trustReservedSubnets();