Yii 1.1中URL/URI对IIS7.0、IIS7.5和Apache的差异

参照http://www.android100.org/html/201407/11/38661.html 一文,可以知道IIS和Apache的差异:

用$URI=$_SERVER["REQUEST_URI"];

在linux下看到的是urlrewrite静态化以后的地址 /exy/exk/list-3/

windows下返回的是原来的地址 /exy/article.php?page=3

这时候发现windows下有个办法HTTP_X_REWRITE_URL

这个数组,linux下没有
所以代码小修改下以兼容两个平台:

$URI =  isset($_SERVER["HTTP_X_REWRITE_URL"]) ? $_SERVER["HTTP_X_REWRITE_URL"] : $_SERVER["REQUEST_URI"];;
echo $URI;

这样就两个平台都能正确的显示了。


今天遇到win7 x64的IIS(即IIS7.5)下的Yii 应用放到win2008 x86的IIS(即IIS7.0)下,出现CActiveForm表单无法正常工作,研究后知道,

对CActiveForm不设置$action,即$action为空时,实际的表单action是如何生成可以如下分析:

CActiveForm的init()中涉及的是以下语句:

  if($this->stateful)
   echo CHtml::statefulForm($this->action, $this->method, $this->htmlOptions);
  else
   echo CHtml::beginForm($this->action, $this->method, $this->htmlOptions);

以上两种情况最终都是CHtml::beginForm()中的以下语句:

$htmlOptions['action']=$url=self::normalizeUrl($action);

即CHtml::normalizeUrl($action)决定了表单action属性值

继续追踪就涉及到语句return $url==='' ? Yii::app()->getRequest()->getUrl() : $url;

CHttpRequest对象的getUrl()就是getRequestUri(),进行如下拦截查看:

	public function getRequestUri()
	{
		if($this->_requestUri===null)
		{
			if(isset($_SERVER['HTTP_X_REWRITE_URL'])) // IIS
				$this->_requestUri=$_SERVER['HTTP_X_REWRITE_URL'];
			elseif(isset($_SERVER['REQUEST_URI']))
			{
				$this->_requestUri=$_SERVER['REQUEST_URI'];
				if(!empty($_SERVER['HTTP_HOST']))
				{
					if(strpos($this->_requestUri,$_SERVER['HTTP_HOST'])!==false)
						$this->_requestUri=preg_replace('/^\w+:\/\/[^\/]+/','',$this->_requestUri);
				}
				else
					$this->_requestUri=preg_replace('/^(http|https):\/\/[^\/]+/i','',$this->_requestUri);
			}
			elseif(isset($_SERVER['ORIG_PATH_INFO']))  // IIS 5.0 CGI
			{
				$this->_requestUri=$_SERVER['ORIG_PATH_INFO'];
				if(!empty($_SERVER['QUERY_STRING']))
					$this->_requestUri.='?'.$_SERVER['QUERY_STRING'];
			}
			else
				throw new CException(Yii::t('yii','CHttpRequest is unable to determine the request URI.'));
		}
var_dump($_SERVER); exit;
		return $this->_requestUri;
	}

结果IIS7.0下:

  ["REQUEST_URI"]=> string(10) "/index.php"

IIS7.5下:

  ["REQUEST_URI"]=> string(30) "/index.php?r=site/login" 

显然,上述函数考虑到了IIS和Apache的差异,但应该没有考虑到IIS7.0和IIS7.5的差异。


我们来尝试修补它:

注意到  ["SERVER_SOFTWARE"]=> string(17) "Microsoft-IIS/7.0"

  ["QUERY_STRING"]=> string(12) "r=site/login"


修补如下:

elseif(isset($_SERVER['REQUEST_URI']))
			{
				$this->_requestUri=$_SERVER['REQUEST_URI'];
                if(isset($_SERVER['SERVER_SOFTWARE']) && isset($_SERVER['QUERY_STRING']) && 
                    $_SERVER['SERVER_SOFTWARE'] == 'Microsoft-IIS/7.0') {
                    $this->_requestUri .= '?'.$_SERVER['QUERY_STRING'];
                }
				if(!empty($_SERVER['HTTP_HOST']))
				{
					if(strpos($this->_requestUri,$_SERVER['HTTP_HOST'])!==false)
						$this->_requestUri=preg_replace('/^\w+:\/\/[^\/]+/','',$this->_requestUri);
				}
				else
					$this->_requestUri=preg_replace('/^(http|https):\/\/[^\/]+/i','',$this->_requestUri);
			}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值