【问题标题】:Yii seo url rewrite urlManager and .htaccessYii seo url 重写 urlManager 和 .htaccess
【发布时间】:2013-11-06 08:24:00
【问题描述】:

我参与了 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 步,我使用了以下代码:

 '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/en/ 等等等等。

  • 与上面相同的 url create like this 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] -> 何时查看操作

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

问候, 弗朗切斯科

【问题讨论】:

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


    【解决方案1】:

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

    在带有 Apache/2.4.3 (Win32) OpenSSL/1.0.1c PHP/5.4.7 的 Windows 8 上使用 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>
    

    【讨论】:

    • 您好,感谢您的回复,但是按照您的规定,我还没有达到我的目标。令人上瘾的是,站点/索引路由在 www.mysite.com/lang/en 中进行了转换(我不想要 lang)并导致 404 错误,未找到 lang 控制器但 lang 是参数而不是控制器
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    • 2019-04-23
    • 2019-06-07
    • 1970-01-01
    相关资源
    最近更新 更多