我跟着这个教程。
我想要实现的是
http://something.com/language/controller/action
但我越来越
http://something.com/controller/action?language=en&id=1
据我所知,这是URL 生成的一部分。但我不知道如何解决它。
我错过了什么?
正如@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 管理器,您将只接受支持的语言,而无需任何if或switch
添加关于 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!
通常,您会使用 url 管理器对象中的 defaultParams 选项添加/删除查询字符串参数。从文档中:
defaultParams:此规则提供的默认 GET 参数(名称=>值)。当该规则用于解析传入请求时,该属性中声明的值将被注入到 $_GET 中。
但是,在这种情况下,您扩展了 createURL 方法以手动将这些参数添加到 url 的末尾,以提供多语言 URL 支持。如果您不关心这一点,只需确保您的 params 对象设置为空数组:
return parent::createUrl($route);
使用 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';
}
这是一些非常基本的概念,但您可以根据需要对其进行扩展...