【问题标题】:Yii basic url rewriteYii 基本 url 重写
【发布时间】:2012-04-10 07:43:55
【问题描述】:

我是 php 新手,mvc 新手,yii 新手,url-rewriting 新手。所以,很抱歉,如果我问的是非常基本的问题。

我已经隐藏了 index.php(来自 yii 论坛中讨论的 htaccess 方法)

在我的 urlmanager 中,我有这个,

'urlFormat'=>'path',
             'rules'=>array( 
             '<controller:\w+>/<id:\d+>'=>'view',
             '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
             '<controller:\w+>/<action:\w+>'=>'<controller>/<action>' 
              ),
             'showScriptName'=>false,

我在视图/站点文件夹中有 3 个文件。

  1. '旅程',
  2. '邀请',
  3. 'linkedin'

现在,我的主页应该重定向到“journey”操作(即应该打开“site/journey.php”)

所以,我想,这将是

'/' => 'site/journey'

它也有效。

现在,我希望 'journey/invite' 应该调用 'invite' 操作,即应该打开 'site/invite.php'

而且,“journey/linkedin”应该调用“linkedin”操作,即“site/linkedin.php”。

但是,

'journey/invite' => 'site/invite',
'journey/linkedin' => 'site/linkedin'

不工作。

另外,谁能帮我理解一下,

<controller:\w+>/<id:\d+>

即url中的控制器是什么,'w+'是什么意思?

参考指南也会有所帮助。

根据 bool.dev 的建议编辑:

如您所说,更改了代码(我之前也尝试过,删除了所有默认规则)。 现在我的网址管理器就像,

    '/' => 'site/journey',
    'journey/invite' => 'site/invite',
    'journey/linkedin' => 'site/linkedin',
    '<controller:\w+>/<id:\d+>'=>'view',
    '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
    '<controller:\w+>/<action:\w+>'=>'<controller>/<action>', 

但是会报错

"警告:require_once():open_basedir 限制生效。 文件(/var/xyz.com/../yii/framework/yii.php)不在允许范围内 路径: (/usr/share/php:/usr/share/pear:/usr/share/php/libzend-framework-php:/var/*/tmp:/var/xyz.com) 在 /var/xyz.com/journey.php 第 12 行警告: require_once(/var/xyz.com/../yii/framework/yii.php):打开失败 流:在第 12 行的 /var/xyz.com/journey.php 中不允许操作 致命错误:require_once():需要打开失败 '/var/xyz.com/../yii/framework/yii.php' (include_path='.:/usr/share/php:/usr/share/php/libzend-framework-php') 在第 12 行的 /var/xyz.com/journey.php 中

当我做xyz.com/journey/invite甚至xyz.com/journey

编辑:

这是一个权限问题,@bool.dev 提出的将特定规则放在首位的建议奏效了 :)

【问题讨论】:

  • 好的,在您添加我的建议之前它不起作用时发生了什么?我的意思是它以什么方式不起作用?你有没有显示任何错误?
  • 我也没有工作。它使用通常的语法,但会在 url 路由中引发错误。我可以轻松打开xyz.com/site/journeyxyz.com/site/invitexyz.com/journeyxyz.com/journey/invite 会抛出上面给出的错误。
  • 我的 htaccess 文件有这个代码来隐藏 index.php 文件。 Options +FollowSymLinks IndexIgnore */* RewriteEngine on # if a directory or a file exists, use it directly RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # otherwise forward it to index.php RewriteRule . index.php
  • 你的htaccess看起来不错,我认为这是open_basedir restriction的问题,所以看看那个。最初的谷歌搜索结果为 stackoverflow.com/questions/7328523/… 。抱歉,我对此了解不多。在你解决了这个问题之后,我认为一切都会好起来的。
  • 在谷歌搜索中,我在 yii 中找到了更多指向open_basedir restriction 的链接,所以你应该没有任何问题来获得解决方案。

标签: url-rewriting yii url-routing


【解决方案1】:

这两个:

'journey/invite' => 'site/invite',
'journey/linkedin' => 'site/linkedin'

无法正常工作,因为 url 与之前的规则匹配:

'<controller:\w+>/<action:\w+>'=>'<controller>/<action>'

为防止这种情况发生,请确保在任何特定(即不被正则表达式匹配)重写之前最后提到该规则,因此您的规则可能看起来像这样:

'journey/invite' => 'site/invite',
'journey/linkedin' => 'site/linkedin',
'<controller:\w+>/<action:\w+>'=>'<controller>/<action>'

这:\w+ 表示匹配任何字符串与任何“单词”字符(az 0-9 _)的一次或多次出现,\d+ 表示匹配任何字符串与任何数字的一次或多次出现(0-9 ) .查看php regex

编辑

之前没有仔细阅读您的问题,规则中的controller 只是匹配表达式的名称,因此您可以使用'&lt;contr:\w+&gt;/&lt;act:\w+&gt;'=&gt;'&lt;contr&gt;/&lt;act&gt;'

编辑2

使用规则数组阅读您编辑的问题后,afaik您可以使用''=&gt;'site/journey' 而不是'/'=&gt;'site/journey'

【讨论】:

  • 希望这会有所帮助..如果需要请寻求说明
  • 在您回复后编辑了我的问题。一定要检查一下。
  • 我猜我的第二次编辑可以删除 open_basedir 错误,不确定。无论如何,先尝试解决 open_basedir 错误,然后建议应该可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多