Определение адресов клиентов в PHP

Это скорее краткая заметка чем статья, но все же стоит это учитывать. В PHP, как у в любой серверной обработке, есть заголовки, которые приходят и их можно использовать для обработки запросов, например, для логирования действий пользователей. Обычно многие привыкли, что поставил сервер и он работает. К сожалению, в частности в WordPress, я столкнулся с тем, что учитывается адрес моего Reverse-прокси, а не реальный адрес, с которого подключился посетитель. Вот с этим и будем разбираться.

Что такое HTTP-заголово

В протоколе HTTP при запросе страницы передаются какие-то стандартные заголовки, но так же могут передаваться и дополнительные. Это можно посмотреть в браузере, если нажать F12.

Определение адресов клиентов в PHP

Ко всему прочему интерпретатор PHP предоставляет еще кое-какую дополнительную информацию, например, адрес сервера, адрес клиента, строки запроса и т.д. Для этого у него есть специальный объект $_SERVER. Всю информацию можно посмотреть в документации. У меня Nginx настроен как Reverse-прокси, т.е. web-сервер получает запрос, смотрит что пришло в заголовках и на основе этого определяет куда этот запрос направить дальше. В моем случае перед передачей запроса дальше web-сервер добавляет следующие заголовки:


proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;

Соответственно на сервер передаются те заголовки, которые являются, так сказать, стандартными + дополнительные.

Ну и в чем проблема?

При работе серверного кода разработчик уже с этими данными что-то делает. В моем случае в $_SERVER[‘REMOTE_ADDR‘] содержится адрес моего сервера, а адрес клиента находится в $_SERVER[‘X-FORWARDED-FOR’]. По хорошему WordPress должен его обрабатывать, но он его в упор не видит. Почему этот заголовок? Ну тут я не могу ответить. Сколько я смотрел в интернете, практически везде задают именно имя.

И что делать?

Для начала нужно понять, что PHP, по сути каждый раз выполняет какой-то скрипт и при каждом выполнении загружает файл настроек (например). Тогда, самым простым вариантом можно модифицировать его немного так, чтобы в PHP у нас X-FORWARDED-FOR как-то присваивался в REMOTE_ADDR. Я бы не стал трогать файлы самого движка, так как обновления могут все стереть и придется это делать каждый раз, а вот файл настроек практически не меняется, если только нет очень крупных изменений. Логично…

В таком случае заходим в файл wp-config.ph и опускаемся где у нас присутствует строчка проверки условия с параметром HTTP_X_FORWARDED_PROTO. После этого условия добавляем свое:


if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
}

На мой взгляд вполне подойдет.

Теперь, если у нас появляется заголовок HTTP_X_FORWARDED_FOR, то мы его присваиваем параметру REMOTE_ADDR и WordPress уже будет фиксировать нормально адреса.

Итог

Если есть в WordPress другое решение без модификации кода, то, наверно, это будет лучше. Я лично не нашел. По хорошему нужно не модифицировать заголовки, а обрабатывать их. В данном случае, на мой взгляд, это такой небольшой хак.

Поделиться
Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий

Вы должны быть авторизованы, чтобы разместить комментарий.