Перейти к содержанию

4.3 Ядро WordPress. Функция wp_fix_server_vars()

Last updated on 23.05.2021

Функция «wp_fix_server_vars()» располагается в файле «load.php». Полный путь к нему таков:

корневая папка сайта/wp-includes/load.php

wp_fix_server_vars

Описание wp_fix_server_vars()

Функция «wp_fix_server_vars()» — данная функция анализирует глобальную переменную «$_SERVER» и, при необходимости, исправляет значения некоторых элементов этого массива. Первым делом объявляется глобальная переменная «$PHP_SELF». В ней хранится имя файла текущего выполняемого скрипта, относительно корня документа. То есть, когда серверу отправляется подобный запрос

http://www.mysite.ru/test/index.php?id=1&test=wet&id_theme=512

то в этой переменной будет храниться фрагмент запроса «/test/index.php».

Далее объявляется массив «$default_server_values», котором содержит два элемента. После производится слияние «$default_server_values» и «$_SERVER». В результате получается новый ассоциативный массив, который хранится в глобальной переменной «$_SERVER». Теперь необходимо обработать этот массив.

В первую очередь необходимо выяснить три вещи. Первая вещь — это «URI», который был предоставлен для доступа к этой странице.

  1. URI — это унифицированный (единообразный) идентификатор ресурса. Он содержит информацию об имени и адресе ресурса в сети. Как правило, делится на URL и URN.
  2. URL: Адрес некоторого ресурса в веб.
  3. URN: Имя некоторого ресурса в веб. .

Например:

URI = http://www.mysite.ru/test/index.php?id=1&test=wet&id_theme=512
URL = http://www.mysite.ru
URN = /test/index.php

Вторая вещь, которую необходимо уточнить — это «PHP_SAPI».

PHP_SAPI — это константа, в которой содержится информация о типе интерфейса между веб-сервером и PHP.

Третья — это строка идентификации сервера. Она указывается в заголовках, когда происходит ответ на запрос.

Если строка URI пустая или тип интерфейса отличается от строки «cgi-fcgi», а строке идентификации сервера можно найти подстроку «Microsoft-IIS/», тогда возникает необходимость в формировании URI.

Формирование URI происходит следующим образом. Сначала выясняем существует ли в переменной «$_SERVER» элемент с ключом «HTTP_X_ORIGINAL_URL». Если да, тогда значение этого элемента присваивается элементу переменной «$_SERVER» с ключом «REQUEST_URI». Если же нет, тогда узнаём существует ли в переменной «$_SERVER» элемент с ключом «HTTP_X_REWRITE_URL». Если этот элемент существует, тогда значение этого элемента присваивается элементу переменной «$_SERVER» с ключом «REQUEST_URI». Если и этого элемента нет, тогда переходим к следующему шагу.

Следующий шаг — это поиск элемента с ключом «PATH_INFO». Если он отсутствует, но имеется элемент с ключом «ORIG_PATH_INFO», тогда значение этого присваивается элементу переменной «$_SERVER» с ключом «PATH_INFO». Далее сравниваем элементы переменной «$_SERVER» с ключами «PATH_INFO» и «SCRIPT_NAME». Если они равны, тогда элементу с ключом «REQUEST_URI» присваиваем значение элемента с ключом «PATH_INFO». Если сравниваемые элементы не равны, тогда элементу с ключом «REQUEST_URI» присваивается комбинация значений элементов с ключами «PATH_INFO» и «SCRIPT_NAME».

load-4

Далее в переменной «$_SERVER» ищем элемент с ключом «QUERY_STRING». Это строка запроса через которую была открыта страница. Например у нас есть запрос:

 "http://www.example.com/php/path_info.php/some/stuff?foo=bar"

Тогда в элементе $_SERVER[‘PATH_INFO’] будет храниться строка со значением «/some/stuff», а $_SERVER[‘QUERY_STRING’] будет хранить строку со значением «foo=bar».

Если элемент с ключом «QUERY_STRING» существует, тогда дополняем элемент с ключом «REQUEST_URI» содержимым этого элемента. Для этго используется операция конкатенации.

Итак у нас есть $_SERVER[‘REQUEST_URI’]. Теперь необходимо обработать элемент $_SERVER[‘SCRIPT_FILENAME’], если он существует. Вэтом элементе хранится абсолютный путь к исполняемому скрипту. Обработка этого элемента необходима, так как на некоторых серверах интерпретатор PHP может работать в режиме CGI. В этом случае к абсолютному пути прибавляется окончание «.cgi». Если такое окончание имеется, то элементу $_SERVER[‘SCRIPT_FILENAME’] присваивается значение элемента $_SERVER[‘PATH_TRANSLATED’]. Если окончание «.cgi» не обнаружено, тогда элемент $_SERVER[‘PATH_INFO’] удаляется.

В конце работы функции «wp_fix_server_vars()» внимание уделяется глобальной переменной «$PHP_SELF». Ей присваивается значение элемента глобального массива $_SERVER[‘PHP_SELF’]. Если эта переменная, после операции присваивания, оказалась пустой, то при помощи стандартной функции «preg_replace()» из строки запроса удаляются всё, что стоит после знака «?». За тем полученный результат сохраняется в переменной «$PHP_SELF» и элементе $_SERVER[‘PHP_SELF’].

Пример использования wp_fix_server_vars()

Эта функция запускается сразу после подключения файла «load.php». Строка «62» скриншота.

wp-load-4

Таким образом нам не нужно беспокоиться о том, что $_SERVER[‘REQUEST_URI’] когда-либо будет пустым, поскольку WordPress вызывает функцию «wp_fix_server_vars()» при каждой загрузке, чтобы убедиться, что эта и другие переменные сервера, на которые она опирается, существуют.

Опубликовано в рубрике4. Файл "load.php"Ядро Wordpress