我跟着this tutorial。
我想要达到的目标是
http://something.com/language/controller/action
但我得到了
http://something.com/controller/action?language=en&id=1
据我所知,here is部分是URL生成所在。但我无法弄清楚如何解决它。
我错过了什么?
答案 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';
}
这是一个非常基本的概念,但您可以根据自己的需要进行扩展......