Объявите пользовательскую переменную $_SERVER

Я устанавливаю переменные $_SERVER во включаемый файл следующим образом:

$_SERVER['BOT'] = isset($_SERVER['BOT']) ? $_SERVER['BOT'] : 0; // assume this is not a bot
$_SERVER['REALPAGE'] = isset($_SERVER['REALPAGE']) ? $_SERVER['REALPAGE'] : 0; // assume this is a real page
if (!isset($_SERVER['HOST'])) {
  $_SERVER['HOST'] = isset($_SERVER['REMOTE_HOST']) ? $_SERVER['REMOTE_HOST'] : gethostbyaddr($_SERVER['REMOTE_ADDR']);
}
if (!isset($_SERVER['REFERER'])) {
  $_SERVER['REFERER'] = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : "";
}
if (!isset($_SERVER['AGENT'])) {
  $_SERVER['AGENT'] = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : "";
}

Затем они используются в различных других включениях, чтобы определить, является ли страница реальной или IP-адрес посетителя является BOT.

Я заметил, что хотя с $_SERVER['BOT'], $_SERVER['REALPAGE'], $_SERVER['HOST'] и $_SERVER['REFERER'] проблем нет, иногда $_SERVER[' АГЕНТ'] меняется.

Это потому, что АГЕНТ — зарезервированное слово или что-то в этом роде?

Кстати, у меня нет проблем с их настройкой, хотя исследования здесь, на Stackoverflow и в других местах в Интернете, говорят, что это запрещено. Есть ли причина, по которой у меня нет проблем с их установкой?

На первый взгляд, гораздо лучше использовать собственную переменную, скажем $server, вместо суперглобальной переменной $_SERVER. При необходимости вы можете инициализировать $server = $_SERVER;.

José Carlos PHP 01.07.2024 02:39

«Исследования здесь, на Stackoverflow и в других местах в Интернете, показывают, что это запрещено». - Как бы то ни было, $_SERVER не доступен и никогда не был доступен только для чтения, и очень популярные пакеты, такие как symfony/dotenv, могут писать в него. Даже если AGENT уже существует (например, существует переменная env с таким именем), вы все равно можете ее перезаписать.

Álvaro González 01.07.2024 09:10

Ааа, возможно, мне лучше использовать, скажем, $serverBOT. Это означает, что он не является суперглобальным, но сохраняет свое значение при обработке кода, соответствующего запрошенной странице. Спасибо. Самый полезный.

Adrian Hall 08.07.2024 19:27
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
53
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Пользовательская переменная $_SERVER

$_SERVER['AGENT'] = 'MyValue';

Используйте пользовательскую переменную

echo $_SERVER['AGENT'];

Вопрос касается конкретной проблемы с серверной переменной 'AGENT'. Не то, как получить доступ к таким переменным вообще.

BDL 01.07.2024 11:12
Ответ принят как подходящий

документация php.net

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

Затем они используются в различных других включениях, чтобы определить, является ли страница реальный или IP-адрес посетителя является BOT.

нет никакой полезной причины помещать переменную внутри $_SERVER, поскольку она сбрасывается веб-сервером каждый раз, когда вы перезагружаете страницу. поэтому $AGENT='xxx' и $_SERVER['AGENT']='xxx' имеют одинаковый жизненный цикл

Обратной стороной является то, что если ваш веб-сервер использует в качестве записи «АГЕНТ» (или любой другой ключ, который вы пытаетесь переопределить), у вас может быть какой-то побочный эффект.

Кстати, у меня нет проблем с их настройкой, хотя исследования здесь Stackoverflow и другие сайты в Интернете говорят, что это запрещено. Является есть причина, по которой у меня нет проблем с их установкой?

вы не можете изменить суперглобальное значение, вы сделали это «изменить локальное значение» в «области страницы»

если вы откроете другую страницу или перезагрузите ее (значение записей $_SERVER по-прежнему остается исходным)

«нет никакой полезной причины помещать переменную внутри $_SERVER, поскольку она сбрасывается веб-сервером каждый раз, когда вы перезагружаете страницу. поэтому $AGENT='xxx' и $_SERVER['AGENT']='xxx' имеют одинаковые значения жизненный цикл". Ага, это очень помогает, потому что я никогда толком не понимал, как переменные сохраняют свои значения в коде. Что я делаю, так это создаю главную страницу, а затем включаю различные элементы кода, которые находятся в отдельных файлах. Примерно так же, как раньше делали с подпрограммами. Да, мой опыт программирования восходит к 1970-м и 80-м годам. Спасибо.

Adrian Hall 08.07.2024 19:20

Это также может объяснить мою проблему, поскольку в коде у меня также была переменная $agent. Спасибо за предложение.

Adrian Hall 08.07.2024 19:29

Используйте оператор ?=:

$_SERVER['BOT'] ?= 0; // if not set, set it to 0

Вы также можете использовать оператор ??:

$_SERVER['AGENT'] ?= $_SERVER['HTTP_USER_AGENT'] ?? ""; // ... and if none set, set it to ""

Полный код:

$_SERVER['BOT'] ?= 0;

$_SERVER['REALPAGE'] ?= 0;

$_SERVER['HOST'] ?= $_SERVER['REMOTE_HOST'] ?? gethostbyaddr($_SERVER['REMOTE_ADDR']);

$_SERVER['REFERER'] ?= $_SERVER['REFERER'] ?? $_SERVER['HTTP_REFERER'] ?? "";

$_SERVER['AGENT'] ?= $_SERVER['AGENT'] ?? $_SERVER['HTTP_USER_AGENT'] ?? "";

Также вы можете читать значения, не меняя значения $_SERVER (если это приемлемо в вашем коде):

$bot = $_SERVER['BOT'] ?? 0;

$page = $_SERVER['REALPAGE'] ?? 0;

$host = $_SERVER['HOST'] ?? $_SERVER['REMOTE_HOST'] ?? gethostbyaddr($_SERVER['REMOTE_ADDR']);

$ref = $_SERVER['REFERER'] ?? $_SERVER['HTTP_REFERER'] ?? "";

$agent = $_SERVER['AGENT'] ?? $_SERVER['HTTP_USER_AGENT'] ?? "";

Другие вопросы по теме

Похожие вопросы

Symfony + доктрина: можно настроить только «xml», «yml», «php», «staticphp» или «атрибут» через DoctrineBundle
Как сделать запрос POST через GuzzleRequest?
Объявите псевдонимы для счетчиков, которые используют один и тот же столбец, с помощью метода Laravel Eloquent loadCount()
Ошибка промежуточного программного обеспечения Laravel: аргумент № 1 ($content) должен иметь тип ?string, задан Illuminate\Routing\Redirector
Странное поведение доктрины Symfony во время теста phpunit - поле в базе данных становится нулевым
Xero API: updateOrCreateInvoices перезаписывает контактные данные
Symfony 7.0 AssetMapper: файлы JS загружаются только при загрузке начальной страницы или после обновления F5
Ошибка авторизации при динамическом создании новой базы данных MongoDB с использованием драйвера PHP MongoDB
Как установить PHP-расширение mongodb для PHP 7.1 в 2024 году
MySQL JSON_OBJECTAGG — Как исправить ошибку «PDOException: SQLSTATE[22032]: <>: 3158 JSON-документы могут не содержать NULL-имена элементов»?