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

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