Как определить, заходит ли клиент на веб-сайт через интранет или через Интернет?

Ситуация такова, что у меня есть WordPress, установленный на IIS 7.5, который имеет доступ к Интернету через прокси-сервер, а некоторые части веб-сайта будут делать внешний запрос на стороне клиента (изображения, видео YouTube и т. д.), который требует, чтобы пользователи вводили свои учетные данные прокси-сервера, если они заходят на сайт через интранет.

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

Я нашел этот SO answer, который немного помог (и да, я изменил его на LOCAL_ADDR из-за IIS), но он не работает из-за прокси.

Интернет-запросы к сайту проходят через прокси-сервер, который находится в той же сети, поэтому он считает, что каждый запрос является запросом интрасети.

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

function is_intranet() {
  $serverIP = explode('.',$_SERVER['LOCAL_ADDR']);
  $localIP  = explode('.',$_SERVER['REMOTE_ADDR']);
  return ( 
    ($serverIP[0] == $localIP[0]) && 
    (in_array($serverIP[0],array('127','10','172','192') ) ) 
  );
}

person mhcodner    schedule 18.05.2014    source источник


Ответы (1)


Прокси? Я полагаю, вы имеете в виду обратный прокси. Если это так, многие обратные прокси-серверы добавляют дополнительные заголовки http к исходному запросу. Проверьте, содержат ли заголовки ваших запросов «X-Forwarded-For» http://en.wikipedia.org/wiki/X-Forwarded-For
В общем, последний элемент — это то, что вам нужно.
Пример AC#:

string xff = request.Headers["X-Forwarded-For"];
if (xff != null)
{
    string[] clientIPList = xff.Split(','); 
    string ip = clientIPList.Last();
}
person Fabrizio Accatino    schedule 19.05.2014
comment
Кажется, это было бы логичным решением, потому что проще проверить наличие прокси, чем проверять, находится ли клиент в том же домене. - person mhcodner; 22.05.2014