Yii seo url重写urlManager和.htaccess

时间:2013-10-27 15:46:08

标签: .htaccess mod-rewrite yii url-rewriting seo

我参与了yii webapp中的url seo。我无法达到预期的效果。

首先,该网站是多语言的。我创建了一个语言切换器,我将“lang”参数作为GET值传递给url。

然后我在这个网址上关注了wiki:

http://www.yiiframework.com/wiki/294/seo-conform-multilingual-urls-language-selector-widget-i18n/

  • 步骤1)我创建了urlManager类
  • 步骤2)编辑我的控制器
  • 步骤5)编辑我的配置文件

对于步骤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;当行动是视图时

拜托,有人可以提供我要做的一步一步的程序吗? 谢谢

此致 弗朗西斯

1 个答案:

答案 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>