Суперглобальный массив $_SERVER. В чем разница между HTTP_HOST и SERVER_NAME в PHP? Использование элементов массива $_SERVER

$HTTP_SERVER_VARS [удалено]

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

$_SERVER -- $HTTP_SERVER_VARS [удалено] — Информация о сервере и среде исполнения

Описание

Переменная $_SERVER - это массив, содержащий информацию, такую как заголовки, пути и местоположения скриптов. Записи в этом массиве создаются веб-сервером. Нет гарантии, что каждый веб-сервер предоставит любую из них; сервер может опустить некоторые из них или предоставить другие, не указанные здесь. Тем не менее, многие эти переменные присутствуют в » спецификации CGI/1.1 , так что вы можете их ожидать их реализации и в конкретном веб-сервере.

Переменная $HTTP_SERVER_VARS содержит ту же начальную информацию, но она не суперглобальная . (Заметьте, что $HTTP_SERVER_VARS и $_SERVER являются разными переменными, так что PHP обрабатывает их соответственно). Также учтите, что "длинные массивы" были удалены в версии PHP 5.4.0, поэтому $HTTP_SERVER_VARS больше не существует.

Индексы

Вы можете найти (а можете и не найти) любой из следующих элементов в массиве $_SERVER . Заметьте, что немногие элементы, если вообще такие найдутся, будут доступны (или действительно будут иметь значение), если PHP запущен в командной строке .

" PHP_SELF " Имя файла скрипта, который сейчас выполняется, относительно корня документов. Например, $_SERVER["PHP_SELF"] в скрипте по адресу http://example.com/foo/bar.php будет /foo/bar.php . Константа __FILE__ содержит полный путь и имя файла текущего (то есть подключенного) файла. Если PHP запущен в командной строке, эта переменная содержит имя скрипта, начиная с PHP 4.3.0. Раньше она была недоступна. "argv " Массив аргументов, переданных скрипту. Когда скрипт запущен в командой строке, это дает C-подобный доступ к параметрам командной строки. Когда вызывается через метод GET, этот массив будет содержать строку запроса. "argc " Содержит количество параметров, переданных скрипту (если запуск произведен в командной строке). " GATEWAY_INTERFACE " Содержит используемую сервером версию спецификации CGI; к примеру"CGI/1.1 ". " SERVER_ADDR " IP адрес сервера, на котором выполняется текущий скрипт. " SERVER_NAME " Имя хоста, на котором выполняется текущий скрипт. Если скрипт выполняется на виртуальном хосте, здесь будет содержатся имя, определенное для этого виртуального хоста. " SERVER_SOFTWARE " Строка идентификации сервера, указанная в заголовках, когда происходит ответ на запрос. " SERVER_PROTOCOL " Имя и версия информационного протокола, через который была запрошена страница; к примеру "HTTP/1.0 "; " REQUEST_METHOD " Какой метод был использован для запроса страницы; к примеру "GET ", "HEAD ", "POST ", "PUT ".

Замечание :

PHP скрипт завершается после посылки заголовков (то есть после того, как осуществляет любой вывод без буферизации вывода), если запрос был осуществлен методом HEAD .

" REQUEST_TIME " Временная метка начала запроса. Доступна, начиная с PHP 5.1.0. " REQUEST_TIME_FLOAT " Временная метка начала запроса с точностью до микросекунд. Доступна, начиная с PHP 5.4.0. " QUERY_STRING " Строка запросов, если есть, с помощью которой была получена страница. " DOCUMENT_ROOT " Директория корня документов, в которой выполняется текущий скрипт, в точности та, которая указана в конфигурационном файле сервера. " HTTP_ACCEPT " Содержимое заголовка Accept: из текущего запроса, если он есть. " HTTP_ACCEPT_CHARSET " Содержимое заголовка Accept-Charset: из текущего запроса, если он есть. Например: "iso-8859-1,*,utf-8 ". " HTTP_ACCEPT_ENCODING " Содержимое заголовка Accept-Encoding: gzip ". " HTTP_ACCEPT_LANGUAGE " Содержимое заголовка Accept-Language: из текущего запроса, если он есть. Например: "en ". " HTTP_CONNECTION " Содержимое заголовка Connection: из текущего запроса, если он есть. Например: "Keep-Alive ". " HTTP_HOST " Содержимое заголовка Host: из текущего запроса, если он есть. " HTTP_REFERER " Адрес страницы (если есть), которая привела браузер пользователя на эту страницу. Этот заголовок устанавливается веб-браузером пользователя. Не все браузеры устанавливают его и некоторые в качестве дополнительной возможности позволяют изменять содержимое заголовка HTTP_REFERER . Одним словом, в самом деле ему нельзя доверять. " HTTP_USER_AGENT " Содержимое заголовка User-Agent: из текущего запроса, если он есть. Эта строка содержит обозначение браузера, которым пользователь запросил данную страницу. Типичным примером является строка: Mozilla/4.5 (X11; U; Linux 2.2.9 i586) . Среди прочего, вы можете использовать это значение с функцией get_browser() чтобы адаптировать вывод вашей страницы к возможностям браузера пользователя " HTTPS " Принимает непустое значение, если запрос был произведен через протокол HTTPS.

Замечание : Обратите внимание, что при использовании ISAPI с IIS значение будет off , если запрос не был произведен через протокол HTTPS.

" REMOTE_ADDR " IP-адрес, с которого пользователь просматривает текущую страницу. " REMOTE_HOST " Удаленный хост, с которого пользователь просматривает текущую страницу. Обратный просмотр DNS базируется на значении переменной REMOTE_ADDR .

Замечание : Ваш веб-сервер должен быть настроен, чтобы создавать эту переменную. Для примера, в Apache вам необходимо присутствие директивы HostnameLookups On в файле httpd.conf , чтобы эта переменная создавалась. См. также gethostbyaddr() .

" REMOTE_PORT " Порт на удаленной машине, который используется для связи с веб-сервером. " REMOTE_USER " Аутентифицированный пользователь. " REDIRECT_REMOTE_USER " Аутентифицированный пользователь, если запрос был перенаправлен изнутри. " SCRIPT_FILENAME "

Абсолютный путь к скрипту, который в данный момент исполняется.

Замечание :

Если скрипт запускается в командной строке (CLI), используя относительный путь, такой как file.php или../file.php , переменная $_SERVER["SCRIPT_FILENAME"] будет содержать относительный путь, указанный пользователем.

" SERVER_ADMIN " Эта переменная получает свое значение (для Apache) из директивы конфигурационного файла сервера. Если скрипт запущен на виртуальном хосте, это будет значение, определенное для данного виртуального хоста. " SERVER_PORT " Порт на компьютере сервера, используемый веб-сервером для соединения. Для установок по умолчанию, значение будет "80 "; используя SLL, например, это значение будет таким, какое сконфигурировано для соединений безопасного HTTP.

Замечание : Чтобы получить физический (реальный) порт в Apache 2, необходимо установить UseCanonicalName = On и UseCanonicalPhysicalPort = On , иначе это значение может быть подменено и не вернуть реальной значение физического порта. Полагаться на это значение небезопасно в контексте приложений, требующих усиленной безопасности.

" SERVER_SIGNATURE " Строка, содержащая версию сервера и имя виртуального хоста, которые добавляются к генерируемым сервером страницам, если включено. " PATH_TRANSLATED " Filesystem- (not document root-) based path to the current script, after the server has done any virtual-to-real mapping.

Замечание : Начиная с PHP 4.3.2, переменная PATH_TRANSLATED больше не устанавливается неявно в Apache 2 SAPI , по сравнению с Apache версии 1, где она устанавливается в то же самое значение, что и переменная SCRIPT_FILENAME , когда она не используется Apache. Это изменение было сделано для соответствия спецификации CGI , где переменная PATH_TRANSLATED должна существовать только тогда, когда PATH_INFO определена. Пользователи Apache 2 могут использовать директиву AcceptPathInfo = On в конфигурационном файле httpd.conf для задания переменной PATH_INFO .

" SCRIPT_NAME " Содержит путь, к текущему исполняемому скрипту. Это полезно для страниц, которые должны указывать на самих себя. Константа __FILE__ содержит полный путь и имя текущего (т.е. включаемого) файла. " REQUEST_URI " URI, который был передан для того, чтобы получить доступ к этой странице. Например, "/index.html ". " PHP_AUTH_DIGEST " При выполнении HTTP Digest аутентификации, этой переменной присваивается заголовок "Authorization", который присылается клиентом (его необходимо потом использовать для соответствующей валидации). " PHP_AUTH_USER " Когда выполняется HTTP-аутентификация, этой переменной присваивается имя пользователя, предоставленное пользователем. " PHP_AUTH_PW " Когда выполняется HTTP-аутентификация, этой переменной присваивается пароль, предоставленный пользователем. " AUTH_TYPE " Когда выполняется HTTP-аутентификация, этой переменной присваивается тип аутентификации, который используется. " PATH_INFO " Содержит любой предоставленный пользователем путь, содержащийся после имени скрипта, но до строки запроса, если доступно. Например, если текущий скрипт запрошен по URL http://www.example.com/php/path_info.php/some/stuff?foo=bar , то переменная $_SERVER["PATH_INFO"] будет содержать /some/stuff ?>

Результатом выполнения данного примера будет что-то подобное.

Суперглобальный массив $_SERVER

Одним из важнейших предопределённых массивов является массив $_SERVER - в него PHP-интерпретатор помещает переменные, полученные от сервера. Без данных переменных сложно организовать полноценную поддержку Web-приложений. Ниже приводится описание наиболее важных элементов суперглобального массива $_SERVER.

Замечание

Просмотреть полный список элементов массива $_SERVER можно либо при помощи функции print_r(), которая распечатывает дамп массива либо при помощи функции phpinfo(), которая выводит информацию о PHP-интерпретаторе.

Элемент $_SERVER["DOCUMENT_ROOT"]

Элемент $_SERVER["DOCUMENT_ROOT"] содержит путь к корневой директории сервера, если скрипт выполняется в виртуальном хосте, в данном элементе указывается путь к корневой директории виртуального хоста. Т.е. в конфигурационном файле httpd.conf виртуальный хост имеет директиву DocumentRoot, которой присвоено значение "D:/main", элемент $_SERVER["DOCUMENT_ROOT"] будет содержать значение "D:main".

Элемент $_SERVER["HTTP_ACCEPT"]

В элементе $_SERVER["HTTP_ACCEPT"] описываются предпочтения клиента относительно типа документа. Содержимое этого элемента извлекается из HTTP-заголовка Accept, который присылает клиент серверу. Содержимое данного заголовка может выглядеть следующим образом

image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/msword, */*

Заголовок Accept позволяет уточнить медиа-тип, который предпочитает получить клиент в ответ на свой запрос. Этот заголовок позволяет сообщить серверу, что ответ ограничен небольшим множеством предпочитаемых типов.

Символ * используется для группирования типов в медиа-ряду. К примеру, символом */* задается использование всех типов, а обозначение type/* определяет использование всех подтипов выбранного типа type.

Замечание

Медиа-типы отделяются друг от друга запятыми.

Каждый медиа-ряд характеризуется также дополнительным набором параметров. Одним из них является так называемый относительный коэффициент предпочтения q, который принимает значения от 0 до 1, соответственно, от менее предпочитаемых типов к более предпочитаемым. Использование нескольких параметров q, позволяет клиенту сообщить серверу относительную степень предпочтения для того или иного медиа-типа.

Замечание

По умолчанию параметр q принимает значение 1. Кроме того, от медиа-типа он отделяется точкой с запятой.

Пример заголовка типа Accept:

Accept: audio/*; q=0.2, audio/basic

В данном заголовке первым идёт тип audio/* включающий в себя все музыкальные документы и характеризующийся коэффициентом предпочтения 0.2. Через запятую указан тип audio/basic, для которого коэффициент предпочтения не указан и принимает значение по умолчанию равное единице. Цитируя RFС2616 данный заголовок можно интерпретировать следующим образом: “Я предпочитаю тип audio/basic, но мне можно также слать документы любого другого audio-типа, если они будут доступны, после снижения коэффициента предпочтения более чем на 80 %”.

Пример может быть более сложным.

Accept: text/plain; q=0.5, text/html,
text/x-dvi; q=0.8, text/x-c

Замечание

Следует учитывать, что элемент $_SERVER["HTTP_ACCEPT"] содержит точно такую же информацию, но без начального заголовка Accept.

Этот заголовок интерпретируется следующим образом: Типы документов text/html и text/x-c являются предпочтительными, но если они недоступны, тогда клиент отсылающий данный запрос, предпочтёт text/x-dvi, а, если и его нет, то он может принять тип text/plain.

Элемент $_SERVER["HTTP_ACCEPT_LANGUAGE"]

В элементе $_SERVER["HTTP_ACCEPT_LANGUAGE"] описываются предпочтения клиента относительно языка. Данная информация извлекается из HTTP-заголовка Accept-Language, который присылает клиент серверу. Можно привести следующий пример:

Accept-Language: ru, en; q=0.7

Который можно интерпретировать следующим образом: клиент предпочитает русский язык, но в случае его отсутствия согласен принимать документы на английском. Элемент $_SERVER["HTTP_ACCEPT_LANGUAGE"] будет содержать точно такую же информацию, но без заголовка Accept-Language:

ru, en; q=0.7

Содержимое элемента $_SERVER["HTTP_ACCEPT_LANGUAGE"] можно использовать для определения национальной принадлежность посетителей. Однако результаты будут приблизительными, так как многие пользователи используют английские варианты браузеров, которые будут извещать сервер о том, что посетитель предпочитает лишь один язык - английский.

Элемент $_SERVER["HTTP_HOST"]

В элементе $_SERVER["HTTP_HOST"] содержится имя сервера, которое, как правило, совпадает с доменным именем сайта, расположенного на сервере. Как правило, имя, указанное в данном параметре совпадает с именем $_SERVER["SERVER_NAME"]. В параметре приводится лишь доменное имя без названия протокола (http://), т.е.

www.sofftime.ru

Элемент $_SERVER["HTTP_REFERER"]

В элементе $_SERVER["HTTP_REFERER"] приводится адрес страницы, с которой посетитель пришёл на данную страницу. Переход должен осуществляться по ссылке. Создадим две страницы index.php и page.php.

Страница index.php

Страница page.php будет аналогичного содержания, но ссылка будет указывать на страницу index.php.

Страница page.php

При переходе с одной страницы на другую, под ссылкой будет выводится адрес страницы, с которой был осуществлён переход.

Элемент $_SERVER["HTTP_USER_AGENT"]

Элемент $_SERVER["HTTP_USER_AGENT"] содержит информацию о типе и версии браузера и операционной системы посетителя.

Вот типичное содержание этой строки: "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)". Наличие подстроки "MSIE 6.0" говорит о том, что посетитель просматривает страницу при помощи Internet Explorer версии 6.0. Строка "Windows NT 5.1" сообщает, что в качестве операционной системы используется Windows XP.

Замечание

Для Windows 2000 элемент $_SERVER["HTTP_USER_AGENT"] выглядит следующим образом: "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)")", в то время как для Windows XP - "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)".

Если посетитель воспользуется браузером Opera, то содержание $_SERVER["HTTP_USER_AGENT"]может выглядеть следующим образом: "Mozilla/4.0 (compatible; MSIE 5.0; Windows 98) Opera 6.04 ". Подстрока "MSIE 6.0" здесь так же присутствует, сообщая, что браузер Opera является совместимым с браузером Internet Explorer и использует те же динамические библиотеки Windows. Поэтому, при анализе строки, возвращаемой браузером, следует иметь в виду, что к Internet Explorer относится строка, содержащая подстроку "MSIE 6.0" и не содержащая подстроки "Opera". Кроме того, из данной строки можно заключить, что пользователь использует операционную систему Windows 98.

Замечание

Пользовательский агент браузера Firefox может выглядеть следующим образом Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8) Gecko/20051111 Firefox/1.5.

При использовании браузера Netscape, содержание элемент $_SERVER["HTTP_USER_AGENT"] может выглядеть следующим образом: "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030624 Netscape/7.1". Принадлежность к этому браузеру можно определить по наличию подстроки "Netscape". Кроме того, можно узнать, что посетитель выходит в Интернет, используя операционную версию Linux, с ядром, оптимизированным под Pentium IV, находясь в графической оболочке X-Window. Этот механизм удобно использовать для сбора статистической информации, которая позволяет дизайнерам оптимизировать страницы под наиболее распространенные браузеры.

Элемент $_SERVER["REMOTE_ADDR"]

В элемент $_SERVER["REMOTE_ADDR"] помещается IP-адрес клиента. При тестировании на локальной машине - этот адрес будет равен 127.0.0.1. Однако при тестировании в сети переменная вернёт IP-адрес клиента или последнего прокси-сервера через который клиент попал на сервер. Если клиент использует прокси-сервер узнать его IP-адрес можно при помощи переменной окружения HTTP_X_FORWARDED_FOR, значение которой можно получить при помощи функции getenv().

Замечание

Прокси-сервера являются специальными промежуточными серверами, предоставляющими специальный вид услуг: сжатие трафика, кодирование данных, адаптация под мобильные устройства и т.п. Среди множества прокси-серверов различают так называемые анонимные прокси-сервера, которые позволяют скрывать истинный IP-адрес клиента, такие сервера не возвращают переменной окружения HTTP_X_FORWARDED_FOR.

Извлечение переменной окружения HTTP_X_FORWARDED_FOR

Элемент $_SERVER["SCRIPT_FILENAME"]

В элемент $_SERVER["SCRIPT_FILENAME"] помещается абсолютный путь к файлу от корня диска. Так, если сервер работает под управлением операционной системы Windows, то такой путь может выглядеть следующим образом "d:main estindex.php", т.е. путь указывается от диска, в UNIX-подобной операционной системы путь указывается от корневой директории /, например "/var/share/www/test/index.php".

Элемент $_SERVER["SERVER_NAME"]

В элемент $_SERVER["SERVER_NAME"] помещается имя сервера, как правило, совпадающее с доменным именем сайта, расположенного на нём. Например,

www.softtime.ru

Содержимое элемента $_SERVER["SERVER_NAME"] часто совпадает с содержимым элемента $_SERVER["HTTP_HOST"]. Помимо имени сервера суперглобальный массив $_SERVER позволяет выяснить ещё ряд параметров сервера, например IP-адрес сервера, прослушиваемый порт, какой Web-сервер установлен и версию HTTP протокола. Эта информация помещается в элементы $_SERVER["SERVER_ADDR"], $_SERVER["SERVER_PORT"], $_SERVER["SERVER_SOFTWARE"] и $_SERVER["SERVER_PROTOCOL"], соответственно. Ниже приводится пример с использованием данных элементов.

Использование элементов массива $_SERVER

Элемент $_SERVER["REQUEST_METHOD"]

В элемент $_SERVER["REQUEST_METHOD"] помещается метод запроса, который применяется для вызова скрипта: GET или POST.

  • Перевод
  • Tutorial

Одним из крутейший новшеств в php 5.4 является встроенный сервер, созданный специально для разработки и тестирования. Теперь вы можете писать и тестировать свой код не имея полноценного веб-сервера - просто запустите встроенный сервер, протестируйте свой код, и выключите его, когда закончите.
Сервер, так же, предоставляет возможность и для творческого использования. Например, вы можете распространять портативное web-приложение на CD или USB, или даже как десктопное приложение, созданное на PHP без использования GTK или других графических библиотек.

В мануале PHP подчеркивается, что встроенный сервер предназначен для разработки и рекомендуется не использовать его на боевом сервере. Отсутствуют какие-либо INI директивы отвечающие за сервер (за исключением раскрашивания вывода в консоли), и, кажется, что основная идея документации: «у нас теперь тоже есть Web сервер, отстаньте от нас».
Несмотря на это, я считаю, что встроенные сервер может быть ценным инструментом для разработки и тестирования. К примеру, на моей машине я использую предустановленный Apache с кастомной конфигурацией, подходящей для меня, но иногда я хочу попробовать какие-либо новые Web-приложения. Со встроенным web-сервером я могу протестировать приложение прямо из папки «downloads» или временной папки и переместить в обычную среду, только тогда, когда это будет необходимо.
Но для начала, это не так просто, ведь многие написанные приложения используют.htaccess и mod_rewrite. Но я уверен, что кто-то (может быть один из вас, почему бы и нет?) напишет адаптер для этого, и я хотел бы быть первым, кто протестируют его.
В этой статье я объясню некоторые основные примеры использования встроенного сервера и покажу вам как сделать его полезным для разработки и тестирования.

Используем встроенный сервер Итак, для использования сервера нам необходим php 5.4 или выше. Для проверки версии PHP, выполните:
php -v
Так же вы можете определить доступен ли сервер в вашей сборке выполнив:
php -h
и найдите там описание параметров "-S" и "-t", которые используются только для сервера.
Для проверки сервера вы можете создать в текущей директории файл index.php, который будет содержать в себе вызов функции phpinfo() и затем запустить сервер:
$ php -S 127.0.0.1:8080 PHP 5.4.0RC7 Development Server started at Fri Feb 26 18:49:29 2012 Listening on 127.0.0.1:8080 Document root is /home/ec2-user Press Ctrl-C to quit.
И теперь вы можете увидеть содержимое отданной встроенным web-сервером:

В консоль же будет писаться каждый запрос клиента:
80.180.55.37:36318 : / 80.180.55.37:36584 : /
Возвращаясь назад, разберем параметр командной строки "-S", который используется для указания адреса, с которого сервер будет доступен. Возможные значения:
localhost - сервер будет доступен только с локальной машины,
0.0.0.0 - на любому интерфейсе машины,
Любой внешний или серый IP - только на указанном IP
Параметр "-t" устанавливает указанную директорию «directory root». Например:
$ php -S :8090 -t /home/ec2-user/public
Кроме того,. вы может указать имя конкретного файла-роутера. Например:
$ php -S >localhost or your public IP>:8080 -t /home/ec2-user/public public/index.php
Вывод этого роутера будет парситься и выполняться сервером. Простой пример:

Затем получите доступ ко всем действительным URL-адресам для вашего сайта и проверьте разницу.

Мне потребовалось некоторое время, чтобы понять, что люди подразумевают под " SERVER_NAME более надежным". Я использую общий сервер и не имею доступа к директивам виртуального хоста. Итак, я использую mod_rewrite в.htaccess для сопоставления различных HTTP_HOST в разных каталогах. В этом случае это значение HTTP_HOST имеет смысл.

Ситуация аналогична, если вы используете виртуальные хосты на основе имен: директива ServerName внутри виртуального хоста просто говорит, какое имя хоста будет сопоставлено этому виртуальному хосту. Суть в том, что в обоих случаях имя хоста, предоставленное клиентом во время запроса (HTTP_HOST), должно совпадать с именем на сервере, которое само отображается в каталог. Независимо от того, выполняется ли сопоставление с директивами виртуального хоста или с правилами htaccess mod_rewrite, здесь вторично. В этих случаях HTTP_HOST будет таким же, как SERVER_NAME . Я рад, что Apache настроен таким образом.

Однако ситуация отличается от виртуальных хостов на базе IP. В этом случае и только в этом случае SERVER_NAME и HTTP_HOST могут быть разными, потому что теперь клиент выбирает сервер по IP, а не по имени. Действительно, могут быть специальные конфигурации, где это важно.

Итак, начиная с этого момента, я буду использовать SERVER_NAME , на случай, если мой код будет перенесен в эти специальные конфигурации.

Предполагая, что у вас есть простая настройка (CentOS 7, Apache 2.4.x и PHP 5.6.20) и только один веб-сайт (не предполагающий виртуальный хостинг)...

В смысле PHP $_SERVER["SERVER_NAME"] - это элемент PHP, зарегистрированный в суперкласме $_SERVER на основе вашей конфигурации Apache (директива **ServerName** с UseCanonicalName On) в httpd.conf(будь то из включенной конфигурации виртуального хоста файл, что угодно и т.д.). HTTP_HOST выводится из заголовка HTTP host . Рассматривайте это как пользовательский ввод. Фильтр и проверка перед использованием.

Вот пример того, где я использую $_SERVER["SERVER_NAME"] в качестве основы для сравнения. Следующий метод относится к конкретному дочернему классу, который я назвал ServerValidator (дочерний элемент Validator). ServerValidator проверяет шесть или семь элементов в $_SERVER перед их использованием.

При определении того, является ли HTTP-запрос POST, я использую этот метод.

Public function isPOST() { return (($this->requestMethod === "POST") && // Ignore $this->hasTokenTimeLeft() && // Ignore $this->hasSameGETandPOSTIdentities() && // Ingore ($this->httpHost === filter_input(INPUT_SERVER, "SERVER_NAME"))); }

К моменту вызова этого метода будет выполняться вся фильтрация и проверка соответствующих элементов $_SERVER (и соответствующих наборов свойств).

($this->httpHost === filter_input(INPUT_SERVER, "SERVER_NAME")

Проверяет, что значение $_SERVER["HTTP_HOST"] (в конечном счете полученное из запрошенного HTTP-заголовка host) соответствует $_SERVER["SERVER_NAME"] .

Теперь я использую суперглобальный разговор, чтобы объяснить мой пример, но это потому, что некоторые люди не знакомы с INPUT_GET , INPUT_POST и INPUT_SERVER в отношении filter_input_array() .

Суть в том, что я не обрабатываю запросы POST на моем сервере, если не выполнены все четыре условия. Следовательно, с точки зрения запросов POST отказ в предоставлении HTTP host заголовка (присутствия, проверенного для более ранних) заклинаний doom для строгих браузеров HTTP 1.0 . Кроме того, запрашиваемый хост должен соответствовать значению ServerName в httpd.conf, а по расширению - значению $_SERVER("SERVER_NAME") в супермаклоне $_SERVER . Опять же, я бы использовал INPUT_SERVER с функциями фильтра PHP, но вы ломали мой дрейф.

Как указано в balusC, SERVER_NAME не является надежным и может быть изменен в конфигурации apache, конфигурации сервера сервера и брандмауэра, которые могут находиться между вами и сервером.

Следующая функция всегда возвращает реальный хост (пользовательский типизированный хост) без порта, и он почти надежен:

Function getRealHost(){ list($realHost,)=explode(":",$_SERVER["HTTP_HOST"]); return $realHost; }

поделиться

$_SERVER является одним из важнейших предопределённых массивов в PHP. В нём PHP-интерпретатором размещены переменные, полученные от сервера. Все пользовались этими переменными, или обязательно будут пользоваться, т. к. без них довольно сложно организовать полноценную поддержку веб-приложений.

В своей статье я предлагаю таблицу с основными переменными суперглобального массива $_SERVER. Таблица подобно той, что была сделана для функций PHP для работы со строками.

Чтобы посмотреть все элементы массива $_SERVER, нужно: а) либо вызвать функцию print_r(), которая распечатает массив; б) либо вызвать функцию phpinfo(), которая выведет информацию о PHP-интерпретаторе.

Кратко о $HTTP_SERVER_VARS

Суперглобальный массив $_SERVER пришёл на смену массиву $HTTP_SERVER_VARS в PHP версии 4.1.0. $HTTP_SERVER_VARS сейчас не используется, но знать о нём стоит. Прежде всего, старая версия не являлась автоглобальной. Второе отличие заключается в том, что некоторые элементы массива $_SERVER не существуют в $HTTP_SERVER_VARS, хотя в большинстве случаев их переменные совпадают.

Элемент

Краткое описание

Пример

$_SERVER["DOCUMENT_ROOT"]

Содержит путь к корневому каталогу сервера.

$_SERVER["HTTP_HOST"]

$_SERVER["SERVER_NAME"]

$_SERVER["SCRIPT_FILENAME"]

Содержит имя скрипта, начиная от корневого каталога виртуального хоста.

C:\folder\index.php

/www/folder/index.php

$_SERVER["PHP_SELF"]

$_SERVER["SCRIPT_NAME"]

Содержит имя скрипта.

$_SERVER["REQUEST_URI"]

Содержит имя скрипта, начиная от корневого каталога фиртуального хоста, а также переданные ему методом GET параметры.

/www/folder/index.php?page=2&num=5

$_SERVER["QUERY_STRING"]

Содержит параметры, переданные скрипту методом GET.

Для адреса

http://site.com/index.php?page=2&num=5

будет выведено

$_SERVER["REQUEST_METHOD"]

Содержит метод запроса, который применяется для вызова скрипта.

GET или POST

$_SERVER["HTTP_REFERER"]

Содержит адрес страницы, с которой пришёл посетитель.

http://yandex.ru/yandsearch

$_SERVER["HTTP_USER_AGENT"]

Содержит тип и версию браузера и операционной системы посетителя. Может определять также поисковых роботов и марку сотового телефона. Ниже представлено сопоставление марки телефона и его шифра в строке.

Nokia – NOKIA; Sony Ericsson – ERICSSON или SONYERICSSON; Samsung – SAMSUNG или SEC-; Motorola – MOT; LG – LG или LG-; Alcatel – ALCATEL; Panasonic – PANASONIC; Sagem – SAGEM; Pantech – PANTECH; Siemens – SIE; BenQ – BENQ; NEC – NEC; Sharp – SHARP.

Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) (IE 6 и Windows XP )

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.0) Opera 9.50 (Opera 9.5 и Windows 2000 )

$_SERVER["REMOTE_ADDR"]

Содержит IP-адрес клиента.

$_SERVER["SERVER_ADDR"]

Содержит IP-адрес сервера.

$_SERVER["HTTP_ACCEPT"]

Описывает предпочтения клиента относительно типа документа. Содержимое этого элемента извлекается из HTTP-заголовка Accept, который передаётся серверу клиентом.

Формат вывода: MIME-тип [[; q], другой MIME-тип [; q] ... ]

Предпочитаемых MIME-типов может быть несколько, тогда они перечисляются через запятую. * используется для задания шаблона, группировки. q – коэффициент предпочтения, по умолчанию 1, изменяется от 0 до 1.

image/jpeg, image/x-xbitmap, application/x-shockwave-flash

image/*; q=0.5, image/jpeg (предпочитает жпег всем остальным форматам)

$_SERVER["HTTP_ACCEPT_LANGUAGE"]

Подобен предыдущему элементу, но относится уже к языковым предпочтениям. Может быть использован для определения национальной принадлежности посетителей. Но оценка будет приблизительной, т. к. некоторые любят использовать английские версии браузеров

ru, en; q=0.9 (предпочтение русского, но если его нет - и английский сойдёт)

$_SERVER["HTTP_ACCEPT_CHARSET"]

Подобен предыдущим. Содержит заголовок Accept-Charset

$_SERVER["HTTP_ACCEPT_ENCODING"]

Подобен предыдущим. Содержит заголовок Accept-Encoding

$_SERVER["SERVER_PORT"]

Содержит прослушиваемый порт сервера.

$_SERVER["SERVER_SOFTWARE"]

Содержит информацию о веб-сервере.

Apache/2.2.4 (Win32)

$_SERVER["SERVER_PROTOCOL"]

Содержит версию HTTP-протокола.

$_SERVER["GATEWAY_INTERFACE"]

Содержит версию CGI, используемую веб-сервером.

$_SERVER["REQUEST_TIME"]

Время начала запроса веб-страницы в UNIX-формате. Доступна, начиная с PHP 5.1.0

Полный адрес страницы с параметрами:

Таблицу со всеми функциями можно скачать по ссылке в формате *.doc.

Будьте особо внимательны к переменной $_SERVER["REQUEST_URI"] и не забывайте её проверять! Дело в том, что её использование может быть не особо безопасным. К примеру, на Вашем сайте некоторые урлы формируются с использованием этого параметра. Тогда можно прописать в строке браузера ссылку http://site.com/index.php?”>alert(document.cookie). В результате будет выведено окно, где будет показано содержимое файла кукисов. Данный пример безобиден, но это является дырой, с помощью которой хакер может воспользоваться брешью, к примеру, чтобы украсть данные другого пользователя. Посему - проверяйте переменную на недопустимые символы, а особенно > и