【发布时间】:2011-05-24 21:51:16
【问题描述】:
场景:我正在使用一些 PHP 开发 Apache Web 服务器。我将浏览器指向 https://my.example.com/test.php,其中包含以下代码行:
<pre>
<?php
print_r($_SERVER);
?>
</pre>
为 SERVER_PORT 打印的值是 80,而不是 443。但是,如果我转到 https://my.example.com:80/test.php 网络服务器 (Apache) barfs(连接到 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 文档,我认为如果通过 HTTPS 访问 PHP 脚本(这就是我正在做的),它应该设置为非空值。
知道发生了什么吗?我只是 Web 开发人员 - 我不管理此服务器,但我的服务器管理员告诉我一切正常,但我想知道为什么 $_SERVER['SERVER_PORT'] 在查看 HTTPS URL 时返回 80 而不是 443。
编辑:我已经编辑了上面的例子来说明我打印出整个 $_SERVER 变量的结果。
编辑 2: 按照下面 cmets 中的建议尝试 https://my.example.com:443/test.php 会做同样的事情 - SERVER_PORT 为 80 并且未设置 HTTPS(特别是尝试将此 URL 重定向到 https://my.example.com/test.php)。
编辑 3: 好的,我已经在下面发布了我认为的答案(TL;DR:在 VirtualHost 指令中移动 SSL 指令并更改该指令以使用它的 IP 地址而不是通配符似乎已经解决了问题)。
【问题讨论】:
-
这听起来可能很愚蠢,但我知道 apache 作为反向代理运行并将请求传递给仅在本地接口上运行的 lighttpd 服务器的一种情况
-
为什么不尝试转储完整的 $_SERVER 变量并在其中搜索(反向)代理标头?
-
重要的是
$_SERVER['HTTPS']...那里的价值是什么? -
显然这不是 php 问题,而是与网络服务器有关的问题。你可以在这里找到更多信息:bugs.php.net/bug.php?id=40579
-
@dev-null-dweller - 我没有做类似的事情 - 只是一个普通的 Red Hat/Apache 服务器使用 VirtualHost 来托管几个不同的域。