Yii SEO友好语言启用网址

时间:2013-01-16 23:23:41

标签: php url yii

我跟着this tutorial

我想要达到的目标是

http://something.com/language/controller/action

但我得到了

http://something.com/controller/action?language=en&id=1

据我所知,here is部分是URL生成所在。但我无法弄清楚如何解决它。

我错过了什么?

3 个答案:

答案 0 :(得分:2)

正如@PanagiotisGeorgeRadi建议你必须使用.htaccess(在项目根目录中),我的情况略有不同,但基数是相同的:

RewriteEngine on

Options +FollowSymLinks
IndexIgnore */*

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# otherwise forward it to index.php
RewriteRule . index.php

然后在组件数组中的 protected / config / main.php 中设置网址管理器的个人资料:

    'urlManager' => array(
        'urlFormat' => 'path',
        'showScriptName' => false,
        'rules' => array(
            '<lang:(en|fr|it|es)>/<controller:\w+>/<action:\w+>' => '<controller>/<action>', // only these 4 lang codes
            '<lang:[a-z][a-z]>/<controller:\w+>/<action:\w+>' => '<controller>/<action>', // or a generic pattern
        ),
    ),

然后控制器中的操作具有此签名:

class TestController{
  public function actionIndex($lang){
    // $lang will be en|fr|es|it
    // or [a-z][a-z]
  }
}

使用网址管理器,您只会接受支持的语言而不包含 if 切换

ADD 关于UrlManager的好文档: http://www.yiiframework.com/doc/guide/1.1/en/topics.url

网址管理器的最佳部分是在页面中创建链接,例如:

$url=$this->createUrl('test/index',array('lang'=>'en'));

将是相对路径: en / test / index

$url=$this->createAbsoluteUrl('test/index',array('lang'=>'en'));
如果项目位于documentRoot或 http://www.loc.dom,

将是绝对网址 http://www.loc.dom/en/test/index / sub / path / en / test / index 如果放在其他地方!

答案 1 :(得分:1)

通常,您可以使用url manager对象中的defaultParams选项添加/删除查询字符串参数。来自documentation

  

defaultParams:此规则的默认GET参数(name =&gt; value)   提供。当此规则用于解析传入的请求时,   在此属性中声明的值将注入$ _GET。

但是,在这种情况下,您已经扩展了createURL方法,手动将这些参数添加到网址的末尾,以便提供多语言网址支持。如果您不关心这一点,只需确保您的params对象设置为空数组:

return parent::createUrl($route);

答案 2 :(得分:1)

使用htaccess文件(如果您不熟悉htaccess检查谷歌教程)

在其中添加以下行

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)(.*)$ /index.php?page=$1&request=$2

通过此规则,我们假设您拥有domain.com,并且用户请求以下网址

http://www.domain.com/news/December/politics/Titlearticle1

上述规则将破坏此网址请求并分配

$_GET['page'] = 'news';

$_GET['request'] = '/December/politics/Titlearticle1';

现在在你的PHP脚本

你可以

1)验证页面请求

2)爆炸$ _GET ['request']以进一步验证您的请求

$request_parts = explode('/',$_GET['request']);

3)验证一切!这非常重要,或者您的网站可能容易受到攻击。

像这样:

if($_GET['page'] == 'news')
}
  include 'news.php';
{
else if ($_GET['page'] == 'home')
{
  include 'home.php';
}
  else
{
  include 'error.php';
}

这是一个非常基本的概念,但您可以根据自己的需要进行扩展......