首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >$_SERVER['server_port']返回的端口号不正确

$_SERVER['server_port']返回的端口号不正确
EN

Stack Overflow用户
提问于 2010-12-14 04:32:34
回答 3查看 13.7K关注 0票数 17

场景:我正在使用一些PHP在Apache web服务器上工作。我将浏览器指向包含以下代码行的:

<pre>
<?php
print_r($_SERVER);
?>
</pre>

为SERVER_PORT打印的值是80,而不是443。但是如果我去网络服务器(Apache) barfs (一个错误发生在一个连接到my.example.com:80。SSL收到的记录超过了允许的最大长度。错误码: ssl_error_rx_record_too_long)。如果我转到,那么这个URL将被重定向到,没有任何错误或问题,只是我的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开发人员-我不管理这个服务器,但是我的服务器管理员告诉我一切都在工作,但我想知道为什么在查看HTTPS URL时$_ server _PORT返回80而不是443。

EDIT:我已经编辑了上面的示例,以说明打印出整个$_SERVER变量的结果。

HTTPS 2:按照下面评论中的建议尝试https://my.example.com:443/test.php做了同样的事情- SERVER_PORT是80,并且没有设置HTTPS(特别是尝试将此URL重定向到https://my.example.com/test.php)。

EDIT 3:好的,我已经在下面发布了我认为是这个问题的答案(TL;DR:在VirtualHost指令中移动SSL指令,并更改该指令,以使用其IP地址而不是通配符引用我的站点,这似乎已经解决了问题)。

EN

回答 3

Stack Overflow用户

发布于 2013-03-04 08:29:53

我最近遇到了同样的问题,因为我的一些代码掩盖了同样的问题,阻碍了我的工作。

我对这个问题的诊断如下:这是Apache2.0中的一个奇特的变化。Port指令不再是httpd.conf指令的一部分,本质上划分为ServerName指令和Listen指令。

所以我的apache httpd.conf (Apache 2.2.23)有以下条目

ServerName myservername.com
Listen: 5150

然而,PHP $_SERVER'SERVER_ port‘对端口5150上发出的所有请求都返回80。

因此,在研究Apache文档时,我发现了一条关于Port是一个不推荐使用的指令并包含在ServerName中的花边新闻。

我将servername指令设置如下

ServerName myservername.com:5150
UseCanonicalName On
Listen 5150

突然,php脚本做了正确的事情,报告_SERVER'SERVER_PORT‘为5150。

或者,您的httpd.conf可以读取

ServerName myservername.com
UseCanonicalName Off
Listen 5150

因此,我深入研究了php (5.3.20)源代码和apache源代码,直到我找到了行为的源代码。

该行为根源于(至少对于缓存的2.2.23源代码而言) dirOfApacheSource/server/core.c中的函数AP_DECLARE(apr_port_t) ap_get_server_port(const request_rec *r)

在这里您将看到,如果您的httpd指令被设置为"On“,那么ServerName指令将解析出UseCanonicalName。当ServerName指令的格式不是ServerName myserver.com:myport number时,case代码将获取请求对象的ap_default_port ( apache人员最好将其默认设置为80 )。

如果您担心需要显式地将端口添加到httpd.conf中的ServerName指令,您的另一个选择是将UseCanonicalName设置为"Off",这将强制服务器/core.c中的代码解析URI请求以提取服务器名和端口。

其中的六个,或者其他六个,调整你的apache httpd.conf文件,你很快就会看到预期的结果。

票数 15
EN

Stack Overflow用户

发布于 2010-12-15 03:49:26

好了,我想我想通了。我的服务器管理员将conf.d/ssl.conf

SSLEngine On
# and other SSL directives

<VirtualHost *:443>
        ServerName my.example.com
        ServerAlias my

        # and more directives
</VirtualHost>

<VirtualHost IP_ADDRESS:443>
        ServerName my.example.com
        ServerAlias my

        SSLEngine On
        # and other SSL directives

        # and more directives
</VirtualHost>

现在PHP看到了正确的SERVER_PORT # (443),$_SERVER‘’HTTPS‘也设置好了。因此,它要么将SSL指令放在my.example.com的VirtualHost指令中,要么将VirtualHost指令更改为引用实际的IP地址,而不是解决此问题的通配符。感谢大家在这方面的帮助。

票数 3
EN

Stack Overflow用户

发布于 2010-12-14 22:48:54

我似乎记得几年前我升级我的apache时发生过这种情况。它最终成为了一个糟糕的SSLCipherSuite,IIRC。基本上要确保你有一个完整的SSL配置:

您是否定义了密码、证书和密钥?那SSLEngine呢?在您的配置中至少需要这样的内容...

SSLEngine打开

ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL SSLCipherSuite SSLCertificateFile /path/to/apache/conf/server.crt SSLCertificateKeyFile /path/to/apache/conf/server.key

..。如果您想要验证客户端证书,您还需要执行以下操作:

SSLVerifyClient需要SSLVerifyDepth 10 SSLCACertificateFile /path/to/apache/conf/trustedpubkeys.crt

祝好运!

如果你想验证这是不是真的发生了,启动一个嗅探器,比如tcpdump或wireshark。对于tcpdump,我会使用命令行,比如...

tcpdump -i eth0 -nn -s 1600 ip proto 17和主机IP_ADDRESS

(其中IP_ADDRESS是服务器的fqdn或虚线四元组)

然后获取phpinfo转储页面,或者$_SERVER ()页面,等等。

您的$_SERVER var转储显示了您的远程端口,因此您应该能够看到哪些连接使用了该端口,以及它是连接到端口80还是443。

如果你更喜欢图形用户界面,Wireshark也会让你做同样的事情。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4433229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档