【问题标题】:Yii createUrl using current url as base (behavior differs among servers)Yii createUrl 使用当前 url 作为基础(行为因服务器而异)
【发布时间】:2014-03-27 12:22:46
【问题描述】:

应用程序托管在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

【问题讨论】:

  • 它们是否属于同一个控制器?你在模块内工作吗?
  • 它的部分布局代码 - 这些链接在菜单中。没有使用任何模块。
  • 请添加一些有关操作和视图的代码。所以可能很清楚。

标签: php yii nginx


【解决方案1】:

我通过强制baseUrl解决了我的问题

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

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

【讨论】:

    【解决方案2】:

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

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

    现在,你可以使用 url('/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>
    

    在视图中,你可以使用 url($this->id.'/index'):

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

    【讨论】:

    • 我不明白,你的函数是做什么的?它只是 createUrl 函数的简写,对吗?
    • 也许是,但为什么它属于这里?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 2016-03-17
    相关资源
    最近更新 更多