PHP $ _SERVER ['SERVER_NAME'] возвращает имя компьютера в IIS6 - PullRequest
4 голосов
/ 16 февраля 2011

Моя компания использует программное обеспечение на основе PHP, которое зависит от $_SERVER['SERVER_NAME'] для создания URL.Он работает на PHP 5.2 под Windows Server 2003 или 2008 с IIS6 или IIS7 через FastCGI.

Это работает "правильно" (или, по крайней мере, как мы ожидаем, что это будет работать) в каждой системе IIS, которую мы когда-либо имелиустановил его на.Другими словами, на том же сервере, если вы называете его с http://app.foo.com/myscript.php, $_SERVER['SERVER_NAME'], это «app.foo.com», если вы называете его с http://192.168.1.22/myscript.php, $_SERVER['SERVER_NAME'] это «192.168.1.22»и т. д.

Сегодня мы впервые установили его на сервере (Windows Server 2003 с IIS6), который работает по-другому.Независимо от того, какой URL мы используем для загрузки скрипта, $ _SERVER ['SERVER_NAME'] является 'myserver' (имя компьютера сервера), что вызывает проблемы.

Теперь, когда возникла эта проблема,мы работаем над тем, чтобы исключить использование $_SERVER['SERVER_NAME'] в будущих выпусках программного обеспечения ... но есть ли какая-либо конфигурация, которую я могу выполнить (в IIS6, php.ini, ...?) на этом сервере, чтобы исправить это вТо время?Если мы не можем изменить его так, чтобы $_SERVER['SERVER_NAME'] всегда содержал хост из запрашивающего URL-адреса, есть хотя бы какой-нибудь способ настроить его так, чтобы $_SERVER['SERVER_NAME'] содержал конкретное желаемое полное доменное имя (вместо этого app.foo.com)of 'myserver')?

РЕДАКТИРОВАТЬ: Добавлена ​​награда, поскольку я очень заинтересован в получении ответа на этот вопрос.

Ответы [ 4 ]

2 голосов
/ 16 февраля 2011

но есть ли какая-либо конфигурация, которую я могу выполнить (в IIS6, php.ini, ...?) На этом сервере, чтобы исправить это в это время?

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

Например, в открывшемся PHP-файле вы можете просто включить строку:

$_SERVER['SERVER_NAME'] = 'app.foo.com';

Все последующие вызовы $ _SERVER ['SERVER_NAME'] будут иметь желаемое значение.

Если вам необходимо учесть IP-доступ, вы можете использовать комбинацию REQUEST_URI, parse_url () или HTTP_HOST, если доступно.

В долгосрочной перспективе избавление от SERVER_NAME из базы кода, вероятно, поможет снизить ваше кровяное давление:)

0 голосов
/ 19 ноября 2014

Пожалуйста, попробуйте установить заголовки хоста в IIS 6.0 и протестируйте его Ссылка

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

Переменная SERVER_NAME ДОЛЖНА быть установлена ​​на имя хоста сервера. на который направлен запрос клиента. Это без учета регистра имя хоста или сетевой адрес. Он формирует принимающую часть Script-URI.

  SERVER_NAME = server-name
  server-name = hostname | ipv4-address | ( "[" ipv6-address "]" )

Развернутый сервер может иметь более одного возможного значения для этого переменная, где несколько виртуальных хостов HTTP имеют один и тот же IP-адрес. В этом случае сервер будет использовать содержимое узла запроса поле заголовка для выбора правильного виртуального хоста.

0 голосов
/ 16 ноября 2014

Насколько я слышал, $_SERVER['SERVER_NAME'] дает значение, определенное в файле конфигурации сервера, и ничего не говорит о запросе.Принимая во внимание, что $_SERVER['HTTP_HOST'] дает вам доменное имя, с помощью которого выполняется текущий запрос, и более непосредственно связано с запросом.

Ниже приведен пример, чтобы прояснить подробнее об этих двух вещах.Предположим, что у вас есть хост, определенный на сервере с ServerName из domain.com и IP address из 198.16.120.100.

Ниже приведены различия между этими двумя переменными:

for http://www.domain.com

$_SERVER['SERVER_NAME'] = domain.com
$_SERVER['HTTP_HOST'] = www.domain.com

for http://198.16.120.100

$_SERVER['SERVER_NAME'] = domain.com
$_SERVER['HTTP_HOST'] = 198.16.120.100

Если вы хотите изменить SERVER_NAME вашего IIS-сервера, я думаю, эта ссылка поможет вам.

Если вам нужно что-то еще, не стесняйтесь.

С уважением

0 голосов
/ 16 февраля 2011

Попробуйте использовать $_SERVER['HTTP_HOST'] или, если это не сработает, используйте $_SERVER['SCRIPT_URI'] и parse_url().

...