WordPress通过301重定向实现非首先域(非www)跳转向本来是一个很简单事情,由于没弄清楚$_SERVER['HTTP_X_REWRITE_URL'] 和$_SERVER['REQUEST_URI']的区别导致了循环重定向问题。
现在来具体研究下$_SERVER['HTTP_X_REWRITE_URL'] 和$_SERVER['REQUEST_URI']的区别
首先要纠正一部分的观点就是IIS+PHP不支持$_SERVER['REQUEST_URI']
不是,不支持是PHP Version 版本的问题,php4.4.0不支持 $_SERVER['REQUEST_URI'],php5.2.5则增加了支持;
$_SERVER['REQUEST_URI']常用来获当前URL
例如:http://www.hujuntao.com/index.php?p=3
$_SERVER['REQUEST_URI']获得的就是/index.php?p=3这部分
。
$_SERVER["HTTP_X_REWRITE_URL"]则在IIS下获得的是当前URL,在apache下的值为空
例如:
当前URL:http://www.hujuntao.com/
IIS环境下:
$_SERVER['REQUEST_URI'] = /index.php
$_SERVER["HTTP_X_REWRITE_URL"] =/
apache环境下:
$_SERVER['REQUEST_URI'] = /
$_SERVER["HTTP_X_REWRITE_URL"] =”
当前URL:http://www.hujuntao.com/index.php
IIS环境下:
$_SERVER['REQUEST_URI'] = /index.php
$_SERVER["HTTP_X_REWRITE_URL"] =/index.php
apache环境下:
$_SERVER['REQUEST_URI'] = /index.php
$_SERVER["HTTP_X_REWRITE_URL"] =”
而我需要的就是判断当前URL是否包含/index.php
由此可见,IIS环境下首先域名重定向用$_SERVER["HTTP_X_REWRITE_URL"]代替$_SERVER['REQUEST_URI'],apache环境则相反。
function getRequestUri() { if (isset($_SERVER['HTTP_X_REWRITE_URL'])) { // check this first so IIS will catch $requestUri = $_SERVER['HTTP_X_REWRITE_URL']; } elseif (isset($_SERVER['REDIRECT_URL'])) { // Check if using mod_rewrite $requestUri = $_SERVER['REDIRECT_URL']; } elseif (isset($_SERVER['REQUEST_URI'])) { $requestUri = $_SERVER['REQUEST_URI']; } elseif (isset($_SERVER['ORIG_PATH_INFO'])) { // IIS 5.0, PHP as CGI $requestUri = $_SERVER['ORIG_PATH_INFO']; if (!empty($_SERVER['QUERY_STRING'])) { $requestUri .= '?' . $_SERVER['QUERY_STRING']; } } return $requestUri; }
$PHP_SCHEME = $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://'; //测试服务器是否启动了ssl 连接如
https 协议默认端口 是443