0

我跟着这个教程

我想要实现的是

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

但我越来越

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

据我所知,这是URL 生成的一部分。但我不知道如何解决它。

我错过了什么?

4

3 回答 3

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

然后在components数组的protected/config/main.php中设置 URL 管理器的配置文件:

    '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]
  }
}

使用 url 管理器,您将只接受支持的语言,而无需任何ifswitch

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

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

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

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

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

如果项目位于 documentRoot 中,则为绝对 URL http://www.loc.dom/en/test/index ;如果位于其他位置,则为http://www.loc.dom/sub/path/en/test/index

于 2013-01-16T23:57:52.417 回答
1

通常,您会使用 url 管理器对象中的 defaultParams 选项添加/删除查询字符串参数。从文档中:

defaultParams:此规则提供的默认 GET 参数(名称=>值)。当该规则用于解析传入请求时,该属性中声明的值将被注入到 $_GET 中。

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

return parent::createUrl($route);
于 2013-01-16T23:30:37.677 回答
1

使用 htaccess 文件(如果您不熟悉 htaccess,请查看 google 上的教程)

在其中添加以下行

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

使用此规则,假设您拥有 domain.com 并且用户请求以下 url

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

上面的规则会破坏这个 url 请求并分配

$_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';
}

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

于 2013-01-16T23:38:52.243 回答