1

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

首先,网站是多语言的。我创建了一个语言切换器,我在 url 中将“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”)

我需要的是:

  • 如果有人访问主 url - www.mysite.com - 我需要在 url 中添加语言,所以我可以通过这种方式根据语言拥有不同的 url: www.mysite.com/it/ , www.mysite.com/恩/等等等等

  • 与上面相同的 url 创建像这样 Yii::app()->createUrl('')

  • 如果有人访问 www.mysite.com/index.php?r=site/index 与上述相同并删除 index.php

  • 在所有情况下删除 index.php 和站点

  • 任何类型的 url 总是以 / 字符结尾(也是为了避免重复的内容,为此我添加了 'urlSuffix' => "/")

  • 对于另一个控制器,我需要删除视图操作(但保留另一个) - 并且当存在时,以这种方式将“id”作为 url 的一部分:

    [www.mysite.com/controller/action/id/1?here-other-get-params] 或

    [www.mysite.com/controller/id/1?other-params] -> 查看操作时

请,有人可以提供我要做什么的分步程序吗?谢谢

问候,弗朗切斯科

4

1 回答 1

1

您是否尝试在 .htaccess 中的 index.php 中添加一个斜杠,并且您是否设置了 RewriteBase ?

在 Windows 8 上使用带有 Apache/2.4.3 (Win32) OpenSSL/1.0.1c PHP/5.4.7 的 xampp,以下应该可以工作:

.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>
于 2013-10-27T23:12:01.440 回答