Remove index.php?route=common/home from OpenCart

前端 未结 15 933
太阳男子
太阳男子 2020-11-29 04:56

I currently have User SEO URL\'s set to Yes in OpenCart Admin.

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

相关标签:
15条回答
  • 2020-11-29 05:04

    The previous "solutions" are wrong because they are attacking the SEO URL translate. What you want is to deal with the URL generation inside OpenCart.

    Let's keep it simple. Go to /system/library/url.php and look at the public function link. Replace the function with this version:

    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;
    }
    

    Simple like that. I can't belive why this is not in OpenCart's core.

    EDIT:

    I run some tests and if the SEO URLs are enabled, it becomes necessary to make one single edit in the /catalog/controller/common/seo_url.php to avoid an "Undefined index" error.

    Inside public function rewrite, replace this line:

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

    With this one:

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

    Now it really works.

    0 讨论(0)
  • 2020-11-29 05:05

    I really like Victor Schröder's solution above for it's simplicity. Thanks! I created a vQmod based on his code mods in case it would be helpful to anyone. here is the code:

    <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>
    
    0 讨论(0)
  • 2020-11-29 05:11

    /catalog/controller/common/seo_url.php

    Open the file and replace the below code

    <?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;
            }       
        }   
    }
    ?>
    

    ------------------ WHERE THE CHANGE -------------------------

    The below Line i added in Public Function index() also Public Function rewrite.

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

    index() function Perform like this

    1. Get the query from htaccss "?route=$1" (Ex: the url look like site.com/shirts)
    2. so the route is shirts
    3. now the function check the "shirts" is found in url_alias table if its found then its make a get varible like index.php?categoryID=Value from url_alias Table.
    4. Or else if there are no record in url_alias table for shirts, then its checks weather it is some other pages like information or manufacturer if its found it make a get variable Example index.php?route=information/information or index.php?route=product/manufacturer/info.
    5. But its not check is it found in Layouts. So i added the Code in else block that set the route into get variable like this index.php?route=<route>
    6. So in index() functions its works fine. Like Same i did in rewrite function.
    0 讨论(0)
  • 2020-11-29 05:12

    To remove index.php?route= from urls I simply recommend to edit .htaccess file.

    Just add this:

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

    I encounter no problems whatsoever. Just remember that you need to have RewriteEngine enabled. Look for this line: RewriteEngine On. If not present, past it before above code.

    0 讨论(0)
  • 2020-11-29 05:13

    i got this http://www.antropy.co.uk/index.php/blog/one-quick-opencart-seo-tip-to-avoid-a-duplicate-home-page/ worked for me in removing the code for my homepage

    0 讨论(0)
  • 2020-11-29 05:14

    For me, the simplest way to do it:

    1- Go to /system/library/url.php

    2- Locate function link(

    3- Above return $url; put the following line:

    $url = str_replace('index.php?route=common/home', '', $url);
    
    0 讨论(0)
提交回复
热议问题