我参与了yii webapp中的url seo。我无法达到预期的效果。
首先,该网站是多语言的。我创建了一个语言切换器,我将“lang”参数作为GET值传递给url。
然后我在这个网址上关注了wiki:
http://www.yiiframework.com/wiki/294/seo-conform-multilingual-urls-language-selector-widget-i18n/
对于步骤5,我使用以下代码:
'urlManager' => array(
'class' => 'application.components.UrlManager',
'urlFormat' => 'path',
'showScriptName' => false,
'urlSuffix'=>"/",
'rules' => array(
'<lang:(de|it|en|fr|es)>'=>'',
'<lang:(de|it|en|fr|es)>'=>'site/index',
'<lang:(de|it|en|fr|es)>/<action:(!index)>/*' => 'site/<action>',
'<lang:(de|it|en|fr|es)>/<controller:\w+>/<id:\d+>' => '<controller>/view',
'<lang:(de|it|en|fr|es)>/<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
'<lang:(de|it|en|fr|es)>/<controller:\w+>/<action:\w+>/*' => '<controller>/<action>',
),
),
我的.htaccess与yii默认.htaccess
相同<Files .htaccess>
order allow,deny
deny from all
</Files>
Options All -Indexes
我什么都没改变。
现在,我已经为urlManager尝试了不同的规则,并尝试向htacces添加其他规则,但没有成功。
我的问题是,有些页面中断了404错误,对于图像或脚本等资源也是如此。如果我从元素检查器检查资源请求的URL,我看到请求的URL是重写网站的URL(这是正确的行为吗?) 我还尝试将整个项目放在一个根子文件夹下,创建一个与生产不同的测试环境,由于子文件夹,结果更糟。 此外,如果我点击主页链接,系统会将我重定向到www.mysite.com/lang/en
此外,我添加了一种基于ip检索语言或静态设置的行为,因此在请求处理结束时,我总是有一个语言代码作为get参数。
(GET语言url参数称为“lang”)
我需要的是:
如果有人访问主网址 - www.mysite.com - 我需要在网址中添加该语言,因此我可以通过以下方式根据语言设置不同的网址:www.mysite.com/it/, www.mysite.com/en/ etc etc。
与上面相同的网址创建如下Yii :: app() - &gt; createUrl('')
如果有人访问www.mysite.com/index.php?r=site/index与上述相同并删除index.php
在所有情况下删除index.php和网站
任何类型的网址总是以/字符结尾(也是为了避免重复内容,为此我添加了'urlSuffix'=&gt;“/”)
对于另一个控制器,我需要删除视图操作(但保留另一个) - 当存在时,以这种方式将“id”作为url的一部分:
[www.mysite.com/controller/action/id/1?here-other-get-params]或
[www.mysite.com/controller/id/1?other-params] - &gt;当行动是视图时
拜托,有人可以提供我要做的一步一步的程序吗? 谢谢
此致 弗朗西斯
答案 0 :(得分:1)
您是否尝试在.htaccess中为index.php添加尾部斜杠并设置了RewriteBase?
使用xampp在Windows 8上使用Apache / 2.4.3(Win32)OpenSSL / 1.0.1c PHP / 5.4.7,以下内容应该有效:
.htaccess
RewriteEngine on
#LOCAL
RewriteBase /myDir/subDir/
# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
# otherwise forward it to index.php
RewriteRule . /index.php
AddDefaultCharset utf-8
在config / main.php中
'urlManager' => array(
'class' => 'application.components.UrlManager', // which refers to UrlManager.php
'urlFormat' => 'path',
'showScriptName' => false,
'rules' => array(
'login' => 'site/login',
'<language:(de|en|fr|es)>/' => 'content/index',
'<language:(de|en|fr|es)>/<action:(contact|login|logout)>/*' => 'site/<action>',
'<language:(de|en|fr|es)>/<controller:\w+>/<id:\d+>' => '<controller>/view',
'<language:(de|en|fr|es)>/<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
'<language:(de|en|fr|es)>/<controller:\w+>/<action:\w+>/*' => '<controller>/<action>',
'<language:(de|en|fr|es)>/<module:\w+>/<controller:\w+>/<action:\w+>/*' => '<module>/<controller>/<action>',
),
),
和/protected/components/UrlManager.php
<?php
class UrlManager extends CUrlManager
{
public function createUrl($route,$params=array(),$ampersand='&')
{
if (!isset($params['language'])) {
if (Yii::app()->user->hasState('language'))
Yii::app()->language = Yii::app()->user->getState('language');
else if(isset(Yii::app()->request->cookies['language']))
Yii::app()->language = Yii::app()->request->cookies['language']->value;
$params['language']=Yii::app()->language;
}
return parent::createUrl($route, $params, $ampersand);
}
}
和httpd.conf
<Directory "C:/Users/someuser/htdocs">
Options Indexes FollowSymLinks MultiViews Includes ExecCGI
AllowOverride All
Order Allow,Deny
Allow from all
Require all granted
</Directory>