Сценарий: Я работаю на веб-сервере Apache с небольшим количеством PHP.Я указываю моему браузеру на https://my.example.com/test.php, в котором есть следующие строки кода:
<code><pre>
<?php
print_r($_SERVER);
?>
Значение, выведенное для SERVER_PORT, равно 80., а не 443 .Но если я зайду на https://my.example.com:80/test.php barfs веб-сервера (Apache) (Произошла ошибка при подключении к my.example.com:80. SSL получил запись, превышающую максимально допустимую длину. Код ошибки: ssl_error_rx_record_too_long).Если я перейду на https://my.example.com:443/test.php, то URL-адрес перенаправляется на https://my.example.com/test.php без ошибок или проблем, за исключением того, что мой PHP распечатывает, что порт сервера 80 вместо 443.
Вот соответствующий раздел из файла conf.d / ssl.conf (я удалил лишние директивы и заменил фактический IP-адрес словом IP_ADDRESS):
Listen IP_ADDRESS:443
<VirtualHost *:443>
ServerName my.example.com
ServerAlias my
DocumentRoot "/path/to/document_root/htdocs"
Options +Indexes
</VirtualHost>
Вот полная распечатка переменной $ _SERVER (данные моего сервера отредактированы / изменены на анонимные примеры):
Array
(
[HTTP_HOST] => my.example.com
[HTTP_USER_AGENT] => Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.11) Gecko/20101012 Firefox/3.6.11
[HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
[HTTP_ACCEPT_LANGUAGE] => en-us,en;q=0.5
[HTTP_ACCEPT_ENCODING] => gzip,deflate
[HTTP_ACCEPT_CHARSET] => ISO-8859-1,utf-8;q=0.7,*;q=0.7
[HTTP_KEEP_ALIVE] => 115
[HTTP_CONNECTION] => keep-alive
[HTTP_COOKIE] => PHPSESSID=randomstring_yes_I'm_that_paranoid
[PATH] => /sbin:/usr/sbin:/bin:/usr/bin
[SERVER_SIGNATURE] =>
Apache/2.2.3 (Red Hat) Server at my.example.com Port 80
[SERVER_SOFTWARE] => Apache/2.2.3 (Red Hat)
[SERVER_NAME] => my.example.com
[SERVER_ADDR] => IP_ADDRESS_1
[SERVER_PORT] => 80
[REMOTE_ADDR] => IP_ADDRESS_2
[DOCUMENT_ROOT] => /path/to/document_root/htdocs
[SERVER_ADMIN] => admin@example.com
[SCRIPT_FILENAME] => /path/to/document_root/htdocs/test.php
[REMOTE_PORT] => 49178
[GATEWAY_INTERFACE] => CGI/1.1
[SERVER_PROTOCOL] => HTTP/1.1
[REQUEST_METHOD] => GET
[QUERY_STRING] =>
[REQUEST_URI] => /test.php
[SCRIPT_NAME] => /test.php
[PHP_SELF] => /test.php
[REQUEST_TIME] => 1292273758
)
Как видите, SERVER_PORT равен 80 и $ _SERVER [«HTTPS»] не установлен.В соответствии с документами по PHP, я думал, что должно быть установлено непустое значение, если доступ к сценарию PHP осуществляется через HTTPS (что я и делаю).
Есть идеи, что происходит?Я просто веб-разработчик - я не управляю этим сервером, но мой администратор сервера говорит мне, что все работает, но я хотел бы знать, почему $ _SERVER ['SERVER_PORT'] возвращает 80 вместо 443 при просмотре URL-адреса HTTPS.
РЕДАКТИРОВАТЬ: Я отредактировал приведенный выше пример, чтобы проиллюстрировать свои результаты при печати всей переменной $ _SERVER.
РЕДАКТИРОВАТЬ 2: Попыткаhttps://my.example.com:443/test.php, как предлагается в комментариях ниже, делает то же самое - SERVER_PORT равен 80, а HTTPS не установлен (в частности, при попытке этого URL-адреса перенаправляется на https://my.example.com/test.php).
РЕДАКТИРОВАТЬ 3: ОК, я опубликовал, как мне кажется, ответ на этот вопрос ниже (TL; DR: перемещение директив SSL в директиве VirtualHost и изменение этой директивы для ссылки на мой сайт с использованием его IP-адреса, а не подстановочного знака, по-видимому, разрешилопроблема).