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

随机推荐

  1. github第一步之初始化操作

    目录 0.首先注册一个账号 1.创建知识库Repository 2.创建一个分支branch--feature 3.制作并提交commit 4.打开拉取请求pull 5.合并自己的pull请求 git ...

  2. 使用scp上传和下载文件

    利用scp传输文件 1.从服务器下载文件 scp username@servername:/path/filename /tmp/local_destination 例如scp codinglog@1 ...

  3. flask-数据库模型设计2

    3.数据库模型设计 3.1构建蓝图项目目录 1.前后台项目目录分析   2.蓝图构建项目目录 蓝图:一个应用中或跨域应用制作组件和支持通用模式. 蓝图的作用:将不同的功能模块化 构建大型应用 优化项目 ...

  4. mybatis*中DefaultVFS的logger乱码问题

    从网上下的Java Persistence with MyBatis 3的源码 出现这个问题的原因是logback记日志的时候乱码 ResolverUtil - Not a JAR: file:... ...

  5. PostgreSQL查看表大小的命令

    SELECT table_name, pg_size_pretty(table_size) AS table_size, pg_size_pretty(indexes_size) AS indexes ...

  6. python模块安装注意事项

    在安装python的第三方模块时,需要注意路径问题. 1.如果python是按默认位置安装的,则可以直接在命令提示符中进行安装,即pip install module_name. 2.如果python ...

  7. Jsop的原理

    Jsop的原理:利用script不存在跨域的问题,动态创建script标签,把需要请求的数据源地址赋值给其src属性,并且指定一个回调函数,从而接受到我们想要的数据

  8. 【转】[总结]vue开发常见知识点及问题资料整理(持续更新)

    1.(webpack)vue-cli构建的项目如何设置每个页面的title 2.vue项目中使用axios上传图片等文件 3.qs.stringify() 和JSON.stringify()的区别以及 ...

  9. ActiveMQ 中的链表

    ActiveMQ 中的消息在内存中时,以链表形式保存,以 PendingList 表示,每一个消息是 PendingNode. PendingList 主要有2种实现:OrderedPendingLi ...

  10. VSS+SourceAnywhere for VSS搭建版本控制系统教程

    VSS:Microsoft Visual Source Safe,本教程使用VSS2005(好像2005就是官方更新的最后一版了). SourceAnywhere for VSS:分为服务端和客户端: ...