Redirects in vip-config.php
To use more than one domain per site, custom configurations can be added to vip-config.php
to handle redirecting secondary domains to the main domain for a site.
Handling domain redirects in vip-config.php
improves the speed and performance of the redirects because vip-config.php
is loaded before WordPress. However, because this code runs before WordPress is loaded, WordPress APIs and functions cannot be relied upon, and the $_SERVER
global variable has not been normalized with default values.
Limitations
- When adding redirects to
vip-config.php
, be sure to exclude the/cache-healthcheck?
URI from the redirects. This URI is used by the VIP Platform to check the health of a site, and a redirect response will cause issues with the site being served correctly. - All characters in the domain values must be lowercase. Domains added with uppercase values will prevent the redirect code from working as expected.
- The code examples provided here will only handle redirects for fully qualified domain names (FQDNs). However, they could be modified to handle redirects for specific URIs (e.g.,
example.com/blog/
) by checking the value of$_SERVER['REQUEST_URI']
.
Domain redirects
In this code example, requests for example.net
or example.org
will be redirected to the same path on the main site, example.com
(i.e. a request to example.net/some/path
will be redirected to example.com/some/path
).
if ( isset( $_SERVER['HTTP_HOST'] ) && isset( $_SERVER['REQUEST_URI'] ) ) {
$http_host = $_SERVER['HTTP_HOST']; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
$request_uri = $_SERVER['REQUEST_URI']; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
$redirect_to_domain = 'www.example.com';
$redirect_domains = array(
'example.net',
'www.example.net',
'example.org',
'www.example.org',
);
/**
* Safety checks for redirection:
* 1. Don't redirect for '/cache-healthcheck?' or monitoring will break
* 2. Don't redirect in WP CLI context
*/
if (
'/cache-healthcheck?' !== $request_uri && // Do not redirect VIP's monitoring.
! ( defined( 'WP_CLI' ) && WP_CLI ) && // Do not redirect WP-CLI commands.
$redirect_to_domain !== $http_host && in_array( $http_host, $redirect_domains, true )
) {
header( 'Location: https://' . $redirect_to_domain . $request_uri, true, 301 );
exit;
}
}
Redirects between www
and non-www
On WordPress single sites, redirects between a domain’s www
and non-www
variants are handled automatically. On WordPress multisites, additional configuration is necessary for redirects between a domain’s www
and non-www
variants to occur.
In this code example, redirects for multiple domains are configured. Each example shows www
variants of a domain redirecting to the domain’s non-www
variant. The example also shows how to include redirects for other domains in addition to the the www
and non-www
variants. The structure of this redirect code: A => [B, C]
, redirects B and C to A.
if ( isset( $_SERVER['HTTP_HOST'] ) && isset( $_SERVER['REQUEST_URI'] ) ) {
$http_host = $_SERVER['HTTP_HOST']; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
$request_uri = $_SERVER['REQUEST_URI']; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
$redirect_domains = array(
/*
'to-this-domain.com' => array(
'from-this-domain.com',
'or-from-this-domain.com',
),
*/
'example-one.com' => array(
'www.exampleone.com',
),
'example-two.com' => array(
'www.example-two.com',
'www.exampletwo.com',
),
'example-three.com' => array(
'www.example-three.com',
'www.examplethree.com',
),
);
/**
* Safety checks for redirection:
* 1. Don't redirect for '/cache-healthcheck?' or monitoring will break
* 2. Don't redirect in WP CLI context
*/
foreach ( $redirect_domains as $redirect_to => $redirect_from_domains ) {
if (
'/cache-healthcheck?' !== $request_uri && // Do not redirect VIP's monitoring.
! ( defined( 'WP_CLI' ) && WP_CLI ) && // Do not redirect WP-CLI commands.
$redirect_to !== $http_host && in_array( $http_host, $redirect_from_domains, true )
) {
header( 'Location: https://' . $redirect_to . $request_uri, true, 301 );
exit;
}
}
}
Last updated: April 15, 2024