Yii 中的Yii::app()->getRequest()->pathInfo
和之间的确切区别是什么?Yii::app()->getRequest()->baseUrl
例子会有所帮助。
2 回答
pathInfo Yii 类参考 | CHttpRequest#pathInfo
返回当前请求的 URL 的路径信息。这是指进入脚本之后和问号之前的部分。开始和结束斜线被剥离。
例如,您的 URL 看起来像
http://example.com/index.php/abc/def/?qwe=123
然后你的“pathInfo”看起来像
abc/def
baseUrl Yiic 类参考 | CHttpRequest#baseUrl
返回应用程序的相对 URL。这与 scriptUrl 类似,只是它没有脚本文件名,并且去掉了结尾的斜线。
要理解它,请参阅CHttpRequest文档和$_SERVER文档。
public function getBaseUrl($absolute=false)
{
if($this->_baseUrl===null)
$this->_baseUrl=rtrim(dirname($this->getScriptUrl()),'\\/');
return $absolute ? $this->getHostInfo() . $this->_baseUrl : $this->_baseUrl;
}
和
public function getScriptUrl()
{
if($this->_scriptUrl===null)
{
$scriptName=basename($_SERVER['SCRIPT_FILENAME']);
if(basename($_SERVER['SCRIPT_NAME'])===$scriptName)
$this->_scriptUrl=$_SERVER['SCRIPT_NAME'];
elseif(basename($_SERVER['PHP_SELF'])===$scriptName)
$this->_scriptUrl=$_SERVER['PHP_SELF'];
elseif(isset($_SERVER['ORIG_SCRIPT_NAME']) && basename($_SERVER['ORIG_SCRIPT_NAME'])===$scriptName)
$this->_scriptUrl=$_SERVER['ORIG_SCRIPT_NAME'];
elseif(($pos=strpos($_SERVER['PHP_SELF'],'/'.$scriptName))!==false)
$this->_scriptUrl=substr($_SERVER['SCRIPT_NAME'],0,$pos).'/'.$scriptName;
elseif(isset($_SERVER['DOCUMENT_ROOT']) && strpos($_SERVER['SCRIPT_FILENAME'],$_SERVER['DOCUMENT_ROOT'])===0)
$this->_scriptUrl=str_replace('\\','/',str_replace($_SERVER['DOCUMENT_ROOT'],'',$_SERVER['SCRIPT_FILENAME']));
else
throw new CException(Yii::t('yii','CHttpRequest is unable to determine the entry script URL.'));
}
return $this->_scriptUrl;
}
和
'SCRIPT_NAME' 包含当前脚本的路径。这对于需要指向自身的页面很有用。FILE常量包含当前(即包含的)文件的完整路径和文件名。
'SCRIPT_FILENAME' 当前执行脚本的绝对路径名。
例如,您的 URL 看起来像
http://example.com/index.php/abc/def/?qwe=123
然后你的“baseUrl”看起来像空字符串(“”),因为
1. $_SERVER['SCRIPT_NAME'] is "/index.php"
2. Yii::app()->request->getScriptUrl() is "/index.php"
3. Yii::app()->request->getBaseUrl() is ""
例如,您的 URL 看起来像(假设您将应用程序不是放在当前主机的根 Web 文件夹中,而是放在子文件夹“customfolder”中)
http://example.com/customfolder/index.php/abc/def/?qwe=123
然后你的“baseUrl”看起来像“/customfolder”,因为
1. $_SERVER['SCRIPT_NAME'] is "/customfolder/index.php"
2. Yii::app()->request->getScriptUrl() is "/customfolder/index.php"
3. Yii::app()->request->getBaseUrl() is "/customfolder"
让我引用参考手册中的一些示例:
在以下两种情况下,应用程序都安装在子目录somefolder
中。
显示脚本名称=假
浏览器网址:http://www.example.com/somefolder/contact?search=term
baseUrl: /somefolder
hostInfo: http://www.example.com
pathInfo: contact
queryString: search=term
requestUri: /somefolder/contact?search=term
scriptFile: /www/www.example.com/htdocs/somefolder/index.php
scriptUrl: /somefolder/index.php
url: /somefolder/contact?search=term
显示脚本名称=真
浏览器网址:http://www.example.com/somefolder/index.php/contact?search=term
baseUrl: /somefolder
hostInfo: http://www.example.com
pathInfo: contact
queryString: search=term
requestUri: /somefolder/index.php/contact?search=term
scriptFile: /www/www.example.com/htdocs/somefolder/index.php
scriptUrl: /somefolder/index.php
url: /somefolder/index.php/contact?search=term