卸下Opencart的的index.php?路径=普通/家庭卸下Opencart的的index.ph

2019-05-16 17:34发布

我现在有User SEO URL's在Opencart的管理员设置为YES。

System -> Settings -> Store -> Server -> User SEO URL's

到目前为止,所有的标签和SEO链接工作; 命令做了期望的效果。

然而,对于网页和其他几个环节; 如何删除:

的index.php?路径=普通/家庭

从URL? 我必须从字面上做一个查找和替换硬编码的PHP文件和风险升级或有另一种方式?

(无腹胀性能即没有差的业余工具,如vQmod)

Answer 1:

简单地删除,你可以做一个基本的替代/catalog/controller/common/seo_url.php

找:

return $link;

它在新线建成之前

$link = str_replace('index.php?route=common/home', '', $link);

通过TheBlackBenzKid编辑:如果你想充分SEO只是用这条线,而不是上面的:

$link = str_replace('index.php?route=', '', $link);

另外,还要确保SEO的URL在商店的管理员控制台打开。



Answer 2:

以前的“解决方案”是错误的,因为他们正在攻击SEO URL 翻译 。 你想要的是处理内部Opencart的URL 生成

让我们保持它的简单。 转到/system/library/url.php ,并期待在public function link 。 更换与此版本的功能:

public function link($route, $args = '', $connection = 'NONSSL') {
    if ('NONSSL' == $connection) {
        $url = $this->url;
    } else {
        $url = $this->ssl;  
    }

    if ('common/home' == $route) {
        if ($args) {
            $url .= '?' . str_replace('&', '&', '&' . ltrim($args, '&')); 
        }
    } else {
        $url .= 'index.php?route=' . $route;
        if ($args) {
            $url .= str_replace('&', '&', '&' . ltrim($args, '&')); 
        }
    }

    foreach ($this->rewrite as $rewrite) {
        $url = $rewrite->rewrite($url);
    }

    return $url;
}

简单的这样。 我不敢相信这是为什么不Opencart的核心。

编辑:

我运行一些测试,如果SEO网址的启用,有必要使一个单一的编辑在/catalog/controller/common/seo_url.php ,以避免“未定义指数”的错误。

内部public function rewrite ,替换此行:

parse_str($url_info['query'], $data);

这一个:

if (isset($url_info['query'])) parse_str($url_info['query'], $data);

现在,它确实有效。



Answer 3:

我真的很喜欢上面的为胜者施罗德的解决方案很简单。 谢谢! 我创建了一个基于他的代码MODS的情况下,这将是有帮助的任何人vQmod。 这里是代码:

<modification>

    <file name="system/library/url.php">
        <operation>
            <search position="before"><![CDATA[$url .= 'index.php?route=' . $route;]]></search>
            <add><![CDATA[
                if ('common/home' == $route) {
                    if ($args) {
                        $url .= '?' . str_replace('&', '&amp;', '&' . ltrim($args, '&'));
                    }
                } else {
            ]]></add>
        </operation>
        <operation>
            <search position="before"><![CDATA[foreach ($this->rewrite as $rewrite) {]]></search>
            <add><![CDATA[
                }
            ]]></add>
        </operation>
    </file>

    <file name="catalog/controller/common/seo_url.php">
        <operation>
            <search position="replace"><![CDATA[parse_str($url_info['query'], $data);]]></search>
            <add><![CDATA[
                if (isset($url_info['query'])) parse_str($url_info['query'], $data);
            ]]></add>
        </operation>
    </file>

</modification>


Answer 4:

怎么样和替换标志的链接<?php echo $base; ?> <?php echo $base; ?> 。 它将使一个链接到基本域,将删除index.php?route=common/home



Answer 5:

周杰伦的解决方案并没有为我工作,编辑后,我得到空白屏幕。 所以我提出一个新问题:

把前行:

return $link;

相反,后:

public function rewrite($link) {


Answer 6:

所以,我使用1.5.5.1关于这个问题没有人回答解决我的问题。 然而,结合从答案@Jay吉尔福特 , @TheBlackBenzKid和@rkaartikeyen我想出了一个完全可行的解决方案。

请记住,使搜索引擎的网址如图@TheBlackBenzKid 。

一种解释可以下面的代码被发现。

[php]
class ControllerCommonSeoUrl extends Controller {
    public function index() {
        // Add rewrite to url class
        if ($this->config->get('config_seo_url')) {
            $this->url->addRewrite($this);
        }

        // Decode URL
        if (isset($this->request->get['_route_'])) {
            $parts = explode('/', $this->request->get['_route_']);

            foreach ($parts as $part) {
                $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE keyword = '" . $this->db->escape($part) . "'");

                if ($query->num_rows) {
                    $url = explode('=', $query->row['query']);

                    if ($url[0] == 'product_id') {
                        $this->request->get['product_id'] = $url[1];
                    }

                    if ($url[0] == 'category_id') {
                        if (!isset($this->request->get['path'])) {
                            $this->request->get['path'] = $url[1];
                        } else {
                            $this->request->get['path'] .= '_' . $url[1];
                        }
                    }   

                    if ($url[0] == 'manufacturer_id') {
                        $this->request->get['manufacturer_id'] = $url[1];
                    }

                    if ($url[0] == 'information_id') {
                        $this->request->get['information_id'] = $url[1];
                    }   
                } else {
                    $this->request->get['route'] = 'error/not_found';   
                }
            }

            if (isset($this->request->get['product_id'])) {
                $this->request->get['route'] = 'product/product';
            } elseif (isset($this->request->get['path'])) {
                $this->request->get['route'] = 'product/category';
            } elseif (isset($this->request->get['manufacturer_id'])) {
                $this->request->get['route'] = 'product/manufacturer/info';
            } elseif (isset($this->request->get['information_id'])) {
                $this->request->get['route'] = 'information/information';
            }else {
                $this->request->get['route'] = $this->request->get['_route_'];
            }

            if (isset($this->request->get['route'])) {
                return $this->forward($this->request->get['route']);
            }
        }
    }

    public function rewrite($link) {
        $url_info = parse_url(str_replace('&', '&', $link));

        $url = ''; 

        $data = array();

        parse_str($url_info['query'], $data);

        foreach ($data as $key => $value) {
            if (isset($data['route'])) {
                if (($data['route'] == 'product/product' && $key == 'product_id') || (($data['route'] == 'product/manufacturer/info' || $data['route'] == 'product/product') && $key == 'manufacturer_id') || ($data['route'] == 'information/information' && $key == 'information_id')) {
                    $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = '" . $this->db->escape($key . '=' . (int)$value) . "'");

                    if ($query->num_rows) {
                        $url .= '/' . $query->row['keyword'];

                        unset($data[$key]);
                    }                   
                } elseif ($key == 'path') {
                    $categories = explode('_', $value);

                    foreach ($categories as $category) {
                        $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = 'category_id=" . (int)$category . "'");

                        if ($query->num_rows) {
                            $url .= '/' . $query->row['keyword'];
                        }                           
                    }

                    unset($data[$key]);
                }
            }
        }

        if ($url) {
            unset($data['route']);

            $query = '';

            if ($data) {
                foreach ($data as $key => $value) {
                    $query .= '&' . $key . '=' . $value;
                }

                if ($query) {
                    $query = '?' . trim($query, '&');
                }
            }

            return $url_info['scheme'] . '://' . $url_info['host'] . (isset($url_info['port']) ? ':' . $url_info['port'] : '') . str_replace('/index.php', '', $url_info['path']) . $url . $query;
        } else {
            $link = str_replace('index.php?route=', '', $link);
            return $link;
        }
    }   
}

显然, @Jay吉尔福特和@TheBlackBenzKid解决正确写入页面上的URL的问题。

Line 113

$link = str_replace('index.php?route=', '', $link);

但似乎打破了网址,由于控制器无法找到页面,因此恢复到错误页面。

Line 38 - 40

} else {
    $this->request->get['route'] = 'error/not_found';   
}

@ rkaartikeyen的解决方案由当前的路由设置请求的路径来解决这个问题

Line 51 - 53

else {
    $this->request->get['route'] = $this->request->get['_route_'];
}


Answer 7:

步骤01.允许使用搜索引擎优化的URL在您的商店服务器设置

进入“系统”,然后点击“设置”。 找到您要更改,然后单击右侧的“编辑”链接商店。 最后点击“服务器”选项卡和SEO URL的电台设置为“是”,保存设置。

注:关键字并不会自动为您创建。 你还必须有Apache的mod_rewrite的打开。 大多数的web主机在默认情况下有这样的。 本教程的步骤3将解释如何添加关键字。

步骤02.改变你的.htaccess文件的某些内容,使您的主页网址SEO友好

转到您的主机控制面板,编辑.htaccess文件。 有时,这种文件是隐藏,以取消隐藏它,你可以点击你的虚拟主机控制面板文件管理器,并勾选显示隐藏文件选项,其次是“走出去”按钮。

一旦你找到.htaccess文件更改下面几行:

RewriteBase /
RewriteRule ^sitemap.xml$ index.php?route=feed/google_sitemap [L]
RewriteRule ^googlebase.xml$ index.php?route=feed/google_base [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !.*\.(ico|gif|jpg|jpeg|png|js|css)
RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]

至:

RewriteBase /
RewriteRule ^sitemap.xml$ index.php?route=feed/google_sitemap [L]
RewriteRule ^googlebase.xml$ index.php?route=feed/google_base [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !.*\.(ico|gif|jpg|jpeg|png|js|css)
RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]
RewriteCond %{QUERY_STRING} ^route=common/home$
RewriteRule ^index\.php$ http://www.yourwebsite.co.uk? [R=301,L]

如果你这样做上述主页的步骤将从这样的改变: http://yourwebsite.com/index.php?route=common/home这样: http://yourwebsite.com

步骤03.输入SEO关键词为URL的手动最后,你需要输入搜索引擎关键字,你想拥有URL重写每一个页面,信息,产品和类别。 您可以编辑和创建项目时的数据标签下找到了SEO关键字领域。

一旦你进入了SEO关键词你的URL会工作。

一旦你已经遵循了所有这些说明你就可以开始获得较高的排名,增加流量和更多的客户带来的好处。



Answer 8:

我来晚了,但我的解决方案可能是其他人(对Opencart的2.0.3.1测试)有用:

打开你的MySQL控制台,并运行此查询(改变YOURDATABASE您的数据库名):

INSERT INTO `YOURDATABASE`.`url_alias` (`url_alias_id`, `query`, `keyword`) VALUES (NULL, 'common/home', ' ');

这个怎么运作:

诀窍在于添加空格(“‘)为列‘关键字’,如果插入一个空字符串(’”)这种解决方法不起作用和URL重写将返回再次的index.php?路径=普通/家。



Answer 9:

/catalog/controller/common/seo_url.php

打开该文件并替换下面的代码

<?php
class ControllerCommonSeoUrl extends Controller {
    public function index() {
        // Add rewrite to url class
        if ($this->config->get('config_seo_url')) {
            $this->url->addRewrite($this);
        }

        // Decode URL
        if (isset($this->request->get['_route_'])) {
            $parts = explode('/', $this->request->get['_route_']);

            foreach ($parts as $part) {

                $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE keyword = '" . $this->db->escape($part) . "'");

                if ($query->num_rows) {
                    $url = explode('=', $query->row['query']);

                    if ($url[0] == 'product_id') {
                        $this->request->get['product_id'] = $url[1];
                    }

                    if ($url[0] == 'category_id') {
                        if (!isset($this->request->get['path'])) {
                            $this->request->get['path'] = $url[1];
                        } else {
                            $this->request->get['path'] .= '_' . $url[1];
                        }
                    }   

                    if ($url[0] == 'manufacturer_id') {
                        $this->request->get['manufacturer_id'] = $url[1];
                    }

                    if ($url[0] == 'information_id') {
                        $this->request->get['information_id'] = $url[1];
                    }   
                } else {
                    $this->request->get['route'] = 'error/not_found';   
                }
            }

            if (isset($this->request->get['product_id'])) {
                $this->request->get['route'] = 'product/product';
            } elseif (isset($this->request->get['path'])) {
                $this->request->get['route'] = 'product/category';
            } elseif (isset($this->request->get['manufacturer_id'])) {
                $this->request->get['route'] = 'product/manufacturer/info';
            } elseif (isset($this->request->get['information_id'])) {
                $this->request->get['route'] = 'information/information';
            }else {
                $this->request->get['route'] = $this->request->get['_route_'];
            }

            if (isset($this->request->get['route'])) {
                return $this->forward($this->request->get['route']);
            }
        }
    }

    public function rewrite($link) {
        if ($this->config->get('config_seo_url')) {
            $url_data = parse_url(str_replace('&amp;', '&', $link));
            $url = ''; 

            $data = array();

            parse_str($url_data['query'], $data);
            foreach ($data as $key => $value) {

                if (isset($data['route'])) {
                    if (($data['route'] == 'product/product' && $key == 'product_id') || (($data['route'] == 'product/manufacturer/info' || $data['route'] == 'product/product') && $key == 'manufacturer_id') || ($data['route'] == 'information/information' && $key == 'information_id')) {
                        $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = '" . $this->db->escape($key . '=' . (int)$value) . "'");

                        if ($query->num_rows) {
                            $url .= '/' . $query->row['keyword'];

                            unset($data[$key]);
                        }                   
                    } elseif ($key == 'path') {
                        $categories = explode('_', $value);

                        foreach ($categories as $category) {
                            $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = 'category_id=" . (int)$category . "'");

                            if ($query->num_rows) {
                                $url .= '/' . $query->row['keyword'];
                            }                           
                        }

                        unset($data[$key]);
                    }else {
                        $url .= '/'.$value;
                    }
                }
            }

            if ($url) {
                unset($data['route']);

                $query = '';

                if ($data) {
                    foreach ($data as $key => $value) {
                        $query .= '&' . $key . '=' . $value;
                    }

                    if ($query) {
                        $query = '?' . trim($query, '&');
                    }
                }

                return $url_data['scheme'] . '://' . $url_data['host'] . (isset($url_data['port']) ? ':' . $url_data['port'] : '') . str_replace('/index.php', '', $url_data['path']) . $url . $query;
            } else {
                return $link;
            }
        } else {
            return $link;
        }       
    }   
}
?>

------------------其中所述变化-------------------------

下面我行公共功能指数增加()也公开功能重写。

else {
this->request->get['route'] = $this->request->get['_route_'];
}

index()函数执行这样

  1. 得到htaccss “ 路线 = $ 1吗?”(实例:在URL看起来像site.com/shirts)查询
  2. 这样的路线是衬衫
  3. 现在功能检查“衬衫”在url_alias表中找到如果找到那么它使得到varible像的index.php?从url_alias表的categoryID =价值。
  4. 否则如果在衬衫url_alias表中没有记录,则其检查天气是一些其他的页面,如信息或制造商如果发现它使得到变量实例的index.php?路径=信息/信息或的index.php?路径=产品/制造商/信息。
  5. 但它不检查是在布局中。 所以我添加的代码在设定的路线进入GET变量像这样的index.php else块?路径= < 路径 >
  6. 因此,在指数()函数它工作正常。 像我一样做的重写功能。


Answer 10:

我得到这个http://www.antropy.co.uk/index.php/blog/one-quick-opencart-seo-tip-to-avoid-a-duplicate-home-page/为我工作在去除码我的主页



Answer 11:

在文件\系统\图书馆\ response.php在公共职能输出的开头添加下一行()

if (!defined('HTTP_CATALOG')) $this->output = str_replace(array('index.php?route=common/home', '?route=common/home'), '', $this->output);


Answer 12:

我创建了一个VQMOD这一点。 免费下载这里: http://www.opencart.com/index.php?route=extension/extension/info&extension_id=14683

效果很好。



Answer 13:

要删除index.php?route=从网址我只是推荐给编辑.htaccess文件。

只需添加这一点:

RewriteCond %{THE_REQUEST} \ /index\.php\?_route_=?([^&\ ]*)
RewriteRule ^ /%1? [L,R]

我遇到的任何问题任何责任。 只要记住,你必须激活RewriteEngine叙述 。 寻找这一行: RewriteEngine On 。 如果不存在,过去它之前上面的代码。



文章来源: Remove index.php?route=common/home from OpenCart