За последние 24 часа нас посетили 55511 программистов и 1710 роботов. Сейчас ищут 892 программиста ...

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

Тема в разделе "Прочие вопросы по PHP", создана пользователем Umidkhan, 12 янв 2007.

  1. Umidkhan

    Umidkhan Активный пользователь

    С нами с:
    12 янв 2007
    Сообщения:
    1
    Симпатии:
    0
    Суперглобальный массив $_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.example.org

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

    Страница index.php
    <?php
    echo "<a href=page.php>Ссылка на страницу PHP</a><br />";
    echo "Содержимое $_SERVER['HTTP_REFERER'] - ".
    $_SERVER['HTTP_REFERER']
    ?>

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

    Страница page.php
    <?php
    echo "<a href=index.php>Ссылка на страницу PHP</a><br />";
    echo "Содержимое $_SERVER['HTTP_REFERER'] - ".
    $_SERVER['HTTP_REFERER']
    ?>

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

    Элемент $_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 [ru]". Подстрока "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
    <?php
    echo getenv(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.example.org

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

    Использование элементов массива $_SERVER
    <?php
    echo "Имя сервера - ".$_SERVER['SERVER_NAME']."<br />";
    echo "IP-адрес сервера - ".$_SERVER['SERVER_ADDR']."<br />";
    echo "Порт сервера - ".$_SERVER['SERVER_PORT']."<br />";
    echo "Web-сервер - ".$_SERVER['SERVER_SOFTWARE']."<br />";
    echo "Версия HTTP-протокола - ".$_SERVER['SERVER_PROTOCOL']."<br />";
    ?>

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

    <?php
    echo $_SERVER['REQUEST_METHOD']; // GET
    ?>

    Элемент $_SERVER['QUERY_STRING']
    В элемент $_SERVER['QUERY_STRING'] заносятся параметры, переданные скрипту, если строка запроса представляет собой адрес

    http://www.example.org/test/index.php?i ... _theme=512

    то в элемент $_SERVER['QUERY_STRING'] попадёт весь текст после знака "?". Например, при обращении к скрипту, представленному ниже, помещая в строке запроса произвольный текст после знака "?" получим страницу с введённым текстом.

    <?php
    echo $_SERVER['QUERY_STRING']; // id=1&test=wet&id_theme=512
    ?>

    Элемент $_SERVER['PHP_SELF']
    В элемент $_SERVER['PHP_SELF'] помещается имя скрипта, начиная от корневой директории виртуального хоста, т.е. если строка запроса представляет собой адрес

    http://www.example.org/test/index.php?i ... _theme=512

    то элемент $_SERVER['PHP_SELF'] будет содержать фрагмент "/test/index.php". Как правило, этот же фрагмент помещается в элемент $_SERVER['SCRIPT_NAME'].

    Элемент $_SERVER['REQUEST_URI']
    В элемент $_SERVER['REQUEST_URI'] содержит имя скрипта, начиная от корневой директории виртуального хоста и параметры, т.е. если строка запроса представляет собой адрес:

    http://www.example.org/test/index.php?i ... _theme=512

    то элемент $_SERVER['REQUEST_URI'] будет содержать фрагмент "/test/index.php?id=1&test=wet&id_theme=512". Для того, чтобы восстановить в скрипте полный адрес, который помещён в строке запроса, достаточно использовать комбинацию элементов массива $_SERVER, представленную ниже

    Полный адрес к скрипту
    <?php
    echo "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
    ?>

    Муйдинов У.Ю. передает статью Юнусову А.Т

    // Убрал все ссылки. Не надо тут индексироватся...
    // Горбунов.
     
  2. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
  3. Андрей Владимирович

    Андрей Владимирович Активный пользователь

    С нами с:
    18 сен 2006
    Сообщения:
    5
    Симпатии:
    0
    Вопрос по $_SERVER['REQUEST_URI']

    Вопрос. Тестировал локально - конструкция $_SERVER['REQUEST_URI'] работает "на ура". Поместил на хостинг - пустая строка.
    Где собака зарыта?
     
  4. Петр

    Петр Активный пользователь

    С нами с:
    20 мар 2006
    Сообщения:
    1.253
    Симпатии:
    0
    Адрес:
    Центр Вселенной
    Андрей Владимирович, в хостинге и REQUEST_URI?
     
  5. Андрей Владимирович

    Андрей Владимирович Активный пользователь

    С нами с:
    18 сен 2006
    Сообщения:
    5
    Симпатии:
    0
    Извиняюсь, за возможную дремучесть, на которой видимо настаивает Пётр, но в моём сообщении как раз приведен кусок мануала, которым исчерпывается описание $'REQUEST_URI
    Ответа же на свой вопрос я так и не нашёл (потому и решил спросить совета знающих людей).
    Поясню ещё раз. Мой локальный веб-сервер (на котором я отлаживаю модули) работает как по мануалу. А скопированные на хостинг (опубликованные в интернете) программы нет. Связываться с компанией, предоставляющей хост, по некоторым причинам у меня не удаётся.
    Подскажите уж тогда, какая версия PHP поддерживает элемент $_SERVER['REQUEST_URI']. Если это ге сложно конечно.
     
  6. Anonymous

    Anonymous Guest

    По идее все... М/б какие то еще вещи задейстованы? М/б сам сервер не передает REQUEST_URI ?
     
  7. av.s

    av.s Активный пользователь

    С нами с:
    23 янв 2007
    Сообщения:
    28
    Симпатии:
    0
    а кто нибудь сталкивался с тем, что $_SERVER['HTTP_REFERER'] пуст?
     
  8. Anonymous

    Anonymous Guest

    В мануале явно написано, что на реферрер полагатся нельзя.
    1.Для страницы, которая открыта не по ссылке, реферрер будет пуст.
    2.Некоторые прокси его обрезают.
     
  9. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    av.s

    а также некоторые пользователи преднамеренно передают поддельный реферер, юзер агент и т.п.)