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()

Це init .

Заміна функції (перевизначення) — у плагіні можна створити функцію з такою самою назвою, тоді вона замінить поточну функцію.

Основа для:
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-doc.com/foo'); //> https://wp-doc.com/foo

список змін

З версії 2.8.1Введено.

Код wp_validate_redirect() WP 6.0.2

function wp_validate_redirect( $location, $default = '' ) {
	$location = wp_sanitize_redirect( trim( $location, "tnrx08x0B")));
	// Browsers буде завантажувати 'http' є вашим протоколом, і буде об'єднатися до URL-адреси з '//'.
	if ( '//' === substr( $location, 0, 2 ) ) {
		$location = 'http:' . $location;
	}

	// У PHP 5 parse_url() може бути незначною, якщо URL-адреса пошуку '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 $default;
	}

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

	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.
	// Ці catches URLs like https:host.com для яких 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 $default;
	}

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

	$wpp = parse_url( home_url() );

	/**
	 * Filters List з дозволеними hosts to redirect to.
	 *
	 * @ Since 2.3.0
	 *
	 * @param string[] $hosts На 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 = $default;
	}

	return $location;
}