wp_validate_redirect()WP 2.8.1

Проверяет указанный URL на возможность использовать его для редиректа.

По умолчанию разрешаются только URL текущего сайта (внутренние URL адреса).

Если указанный URL не прошел проверку, то функция вернет значение второго параметра $default.

Что делает функция:

  1. Добавляет http: протокол для ссылок без протокола (//)
  2. Проверяет протокол, разрешены только http и https.
  3. Проверяет остальные компоненты URL.
  4. Сравнивает домен указанного URL с белым списком доменов на которые разрешен редирект. По умолчанию в белом списке находится только домен текущего сайта. Расширить белый список можно через фильтр allowed_redirect_hosts.

Чтобы очистить ссылку редиректа, используйте wp_sanitize_redirect()

Pluggable функция — эту функцию можно заменить из плагина. Это значит, что она будет работать (подключается) только после подключения всех плагинов, а до этого момента функция еще не определена... Поэтому нельзя вызывать эту и зависящие от неё функции прямо из кода плагина. Их нужно вызывать через хук plugins_loaded или позднее, например хук init.

Замена функции (переопределение) — в must-use или обычном плагине можно создать функцию с таким же названием, тогда она заменит текущую функцию.

Основа для: wp_get_referer(), wp_safe_redirect()
1 раз — 0.003549 сек (очень медленно) | 50000 раз — 2.44 сек (быстро) | PHP 7.0.32, WP 5.1.1
Хуки из функции

Возвращает

Строку. Указанные URL адрес, если он прошел проверку или значение $default параметра.

Использование

wp_validate_redirect( $location, $default );
$location(строка) (обязательный)
URL, который нужно проверить.
$default(строка)
Дефолтный URL, который вернет функция, если Url из параметра $location не пройдет проверку.
По умолчанию: ''

Примеры

0

#1 Демонстрация работы функции

Предполагается что функция запускалась на сайте wp-kama.ru.

echo wp_validate_redirect( 'http://foo.bar' );                   //> ''
echo wp_validate_redirect( 'http://foo.bar', 'http://my.site' ); //> http://my.site
echo wp_validate_redirect( '//wp-kama.ru/foo' );                 //> http://wp-kama.ru/foo
echo wp_validate_redirect( 'https://wp-kama.ru/foo' );           //> https://wp-kama.ru/foo

Список изменений

С версии 2.8.1 Введена.

Код wp_validate_redirect() WP 6.5.2

function wp_validate_redirect( $location, $fallback_url = '' ) {
	$location = wp_sanitize_redirect( trim( $location, " \t\n\r\0\x08\x0B" ) );
	// Browsers will assume 'http' is your protocol, and will obey a redirect to a URL starting with '//'.
	if ( str_starts_with( $location, '//' ) ) {
		$location = 'http:' . $location;
	}

	/*
	 * In PHP 5 parse_url() may fail if the URL query part contains 'http://'.
	 * See https://bugs.php.net/bug.php?id=38143
	 */
	$cut  = strpos( $location, '?' );
	$test = $cut ? substr( $location, 0, $cut ) : $location;

	$lp = parse_url( $test );

	// Give up if malformed URL.
	if ( false === $lp ) {
		return $fallback_url;
	}

	// Allow only 'http' and 'https' schemes. No 'data:', etc.
	if ( isset( $lp['scheme'] ) && ! ( 'http' === $lp['scheme'] || 'https' === $lp['scheme'] ) ) {
		return $fallback_url;
	}

	if ( ! isset( $lp['host'] ) && ! empty( $lp['path'] ) && '/' !== $lp['path'][0] ) {
		$path = '';
		if ( ! empty( $_SERVER['REQUEST_URI'] ) ) {
			$path = dirname( parse_url( 'http://placeholder' . $_SERVER['REQUEST_URI'], PHP_URL_PATH ) . '?' );
			$path = wp_normalize_path( $path );
		}
		$location = '/' . ltrim( $path . '/', '/' ) . $location;
	}

	/*
	 * Reject if certain components are set but host is not.
	 * This catches URLs like https:host.com for which parse_url() does not set the host field.
	 */
	if ( ! isset( $lp['host'] ) && ( isset( $lp['scheme'] ) || isset( $lp['user'] ) || isset( $lp['pass'] ) || isset( $lp['port'] ) ) ) {
		return $fallback_url;
	}

	// Reject malformed components parse_url() can return on odd inputs.
	foreach ( array( 'user', 'pass', 'host' ) as $component ) {
		if ( isset( $lp[ $component ] ) && strpbrk( $lp[ $component ], ':/?#@' ) ) {
			return $fallback_url;
		}
	}

	$wpp = parse_url( home_url() );

	/**
	 * Filters the list of allowed hosts to redirect to.
	 *
	 * @since 2.3.0
	 *
	 * @param string[] $hosts An array of allowed host names.
	 * @param string   $host  The host name of the redirect destination; empty string if not set.
	 */
	$allowed_hosts = (array) apply_filters( 'allowed_redirect_hosts', array( $wpp['host'] ), isset( $lp['host'] ) ? $lp['host'] : '' );

	if ( isset( $lp['host'] ) && ( ! in_array( $lp['host'], $allowed_hosts, true ) && strtolower( $wpp['host'] ) !== $lp['host'] ) ) {
		$location = $fallback_url;
	}

	return $location;
}