首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Yii中baseUrl与pathInfo的区别

Yii中baseUrl与pathInfo的区别
EN

Stack Overflow用户
提问于 2013-10-12 02:59:29
回答 2查看 2.3K关注 0票数 0

在Yii中,Yii::app()->getRequest()->pathInfoYii::app()->getRequest()->baseUrl的确切区别是什么?举例说明会有所帮助。

EN

回答 2

Stack Overflow用户

发布于 2013-10-12 04:53:07

pathInfo Yii Class Referenсe | CHttpRequest#pathInfo

返回当前请求的URL的路径信息。这指的是在入口脚本之后和问号之前的部分。去掉开头和结尾的斜杠。

例如,您的URL如下所示

代码语言:javascript
复制
http://example.com/index.php/abc/def/?qwe=123

那么你的"pathInfo“看起来就像

代码语言:javascript
复制
abc/def

baseUrl Yiic Class Referenсe | CHttpRequest#baseUrl

返回应用程序的相对URL。这与scriptUrl类似,不同之处在于它没有脚本文件名,并且去掉了结尾斜杠。

要理解它,请参考CHttpRequest文档和$_SERVER文档。

代码语言:javascript
复制
public function getBaseUrl($absolute=false)
{
    if($this->_baseUrl===null)
        $this->_baseUrl=rtrim(dirname($this->getScriptUrl()),'\\/');
    return $absolute ? $this->getHostInfo() . $this->_baseUrl : $this->_baseUrl;
}

代码语言:javascript
复制
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‘包含当前脚本的路径。这对于需要指向自身的页面非常有用。文件常量包含当前(即包含的)文件的完整路径和文件名。

'SCRIPT_FILENAME‘当前正在执行的脚本的绝对路径名。

例如,您的URL如下所示

代码语言:javascript
复制
http://example.com/index.php/abc/def/?qwe=123

那么你的"baseUrl“将看起来像空字符串(""),因为

代码语言:javascript
复制
1. $_SERVER['SCRIPT_NAME'] is "/index.php"
2. Yii::app()->request->getScriptUrl() is "/index.php"
3. Yii::app()->request->getBaseUrl() is ""

例如,您的URL如下所示(想象一下,您将应用程序放在当前主机的根web文件夹中,而不是放在子文件夹“customfolder”中)

代码语言:javascript
复制
http://example.com/customfolder/index.php/abc/def/?qwe=123

那么你的"baseUrl“将看起来像"/customfolder”,因为

代码语言:javascript
复制
1. $_SERVER['SCRIPT_NAME'] is "/customfolder/index.php"
2. Yii::app()->request->getScriptUrl() is "/customfolder/index.php"
3. Yii::app()->request->getBaseUrl() is "/customfolder"
票数 3
EN

Stack Overflow用户

发布于 2013-10-12 16:45:06

让我引用参考手册中的my comment作为一些例子:

在以下两种情况下,应用程序都安装在子目录somefolder中。

showScriptName=false

浏览器网址:http://www.example.com/somefolder/contact?search=term

代码语言:javascript
复制
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

showScriptName=true

浏览器网址:http://www.example.com/somefolder/index.php/contact?search=term

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19325345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档