Yii createUrl使用当前url作为基础(服务器之间的行为不同)

时间:2014-02-25 10:32:56

标签: php yii nginx

托管于www.domain.com

的应用程序
$this->createUrl( '/admin' );

用户点击了管理链接,然后转到www.domain.com/admin

$this->createUrl( '/products' );

用户点击产品链接,转到www.domain.com/admin/products而不是预期的www.domain.com/products

奇怪的是,在登台服务器上,当点击产品时,用户将被带到预期的www.domain.com/products网址,但是当代码被推送到生产环境时,我们就会开始看到这个问题。

我已经要求我的客户提供PHP版本差异,所以在此期间,如果有人知道这里可能存在什么问题,请赐教。

这些操作只是从模型和渲染视图中获取数据 - 没有重定向等

布局代码

<?php if ( ! Yii::app()->user->isGuest ): ?>
<nav id="main-nav">
    <ul class="l_tinynav1">

        <li<?php echo Yii::app()->controller->id === 'admin' ? ' class="active"' : ''; ?>>
            <a href="<?php echo $this->createUrl( '/admin' ); ?>">Home</a>
        </li>

        <li<?php echo Yii::app()->controller->id === 'products' ? ' class="active"' : ''; ?>>
            <a href="<?php echo $this->createUrl( '/products' ); ?>">Products</a>
        </li>

        <li<?php echo Yii::app()->controller->id === 'services' || Yii::app()->controller->id === 'faq' ? '     class="active"' : ''; ?>>
            <a href="#">Content</a>
            <ul style="display: block;">
                <li><a href="<?php echo $this->createUrl( '/services' ); ?>">Services</a></li>
                <li><a href="<?php echo $this->createUrl( '/faq' ); ?>">FAQs</a></li>
            </ul>
        </li>

        <li><a href="<?php echo $this->createUrl( '/admin/logout' ); ?>">Logout</a></li>

    </ul>
</nav>
<?php endif; ?>

注意

服务器使用nginx proxy_pass指令设置反向代理

所以我必须在配置文件中定义requests ['hostInfo'],如下所示:

'components' => array
(
    'request'=>array
(
        'hostInfo'=>'http://www.domain.com'
),

可能相关

更新

经过一些调试,我发现了一些有趣的东西。如果我在/products/add页面上,createUrl将为/admin生成正确的链接。但如果我在/admin页面上,createUrl将为/products/add生成错误的链接。经过进一步调查,我发现这些$_SERVER属性不同。

当我在/admin

[SCRIPT_NAME] => /admin/index.php
[REQUEST_URI] => /admin/index.php
[DOCUMENT_URI] => /admin/index.php

当我在/products/add

[SCRIPT_NAME] => /index.php
[REQUEST_URI] => /products/add
[DOCUMENT_URI] => /index.php

看起来这只是一级路线上的问题,/route会出现问题,但/route/action不会。

nginx config

PHP版本:5.3.27 操作系统:Ubuntu 12

更新

/admin路由

的暂存和生产之间是否存在$ _SERVER标头差异

分段

[SCRIPT_NAME] => /index.php
[REQUEST_URI] => /admin/
[DOCUMENT_URI] => /index.php
[SERVER_SOFTWARE] => nginx/1.0.14

生产

[SCRIPT_NAME] => /admin/index.php
[REQUEST_URI] => /admin/index.php
[DOCUMENT_URI] => /admin/index.php
[SERVER_SOFTWARE] => nginx/1.4.2

2 个答案:

答案 0 :(得分:0)

我通过强制baseUrl

解决了我的问题
'request'=>array
(
    'hostInfo'=>'http://www.domain.com',
    'baseUrl'=>'http://www.domain.com'
)

虽然我希望有人可以提供解释性答案。

答案 1 :(得分:-3)

你需要使用这样的全局函数:

function url($route,$params=array(),$ampersand='&'){
    return Yii::app()->createUrl($route,$params,$ampersand);
}

现在,您可以使用网址('/ admin'):

<nav id="main-nav">
<ul class="l_tinynav1">
    <li<?php echo Yii::app()->controller->id === 'admin' ? ' class="active"' : ''; ?>>
        <a href="<?php echo url( '/admin' ); ?>">Home</a>
    </li>
    <li<?php echo Yii::app()->controller->id === 'products' ? ' class="active"' : ''; ?>>
        <a href="<?php echo url( '/products' ); ?>">Products</a>
    </li>
    ...
    <li><a href="<?php echo url( '/admin/logout' ); ?>">Logout</a></li>
</ul>
</nav>

在视图中,您可以使用网址($ this-&gt; id。'/ index'):

<div class="span2 btn-toolbar">
    <?php echo CHtml::link('Listado',url($this->id.'/index'),array('class'=>'btn')); ?>
</div>