今天无意间遇到这么个问题,就是在使用伪静态后,$_SERVER['SERVER_PORT']无法获取到服务器真实的端口。起先以为是程序问题,但是后来关了程序的伪静态功能后,发现又能正确获取到端口,所以就写了个简单的测试脚本。

在localhost根目录下建个 index.php 文件,内容为:

同一目录下再建个 .htaccess 文件,内容为:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^test$ /index.php
</IfModule>
server_port-1
图1

测试环境:XAMPP 1.7.3 (Apache 2.2.14 + PHP 5.3.1)

测试结果如图1

询问了半天 Google 和百度两兄弟,都没结果,正郁闷之时,突然想起还有官方的帮助文档有很多人会留言,于是去看看。结果,不看不知道,这下子可让我发现新大陆了。原来官网文档(E文)上关于“SERVER_PORT”还有这样一段文字:

Note: Under the Apache 2, you must set UseCanonicalName = On, as well as UseCanonicalPhysicalPort = On in order to get the physical (real) port, otherwise, this value can be spoofed and it may or may not return the physical port value. It is not safe to rely on this value in security-dependent contexts. 
server_port-2
图2

大概意思是说:在 Apache2 下必须要将 UseCanonicalName 和 UseCanonicalPhysicalPort 都设置为 On 才能获取到真实的端口。

这下知道原因了,剩下的就是改 Apache 配置文件了。不过要说明下,配置文件里,可能只能找到 UseCanonicalName,而找不到 UseCanonicalPhysicalPort,当然这不需要担心,只要手动加上就可以了。注意,如果只改了 UseCanonicalName 而没有改 UseCanonicalPhysicalPort 的话,就连不使用伪静态都无法获取到真实端口的!

然后再运行上面测试脚本,结果就应该如图2所示。然后,就没有然后啦~~哈哈~