{"id":10480,"date":"2025-03-27T13:36:33","date_gmt":"2025-03-27T11:36:33","guid":{"rendered":"https:\/\/firstidea.gr\/how-to-remove-index-phproutecommon-home-from-the-opencart-homepage\/"},"modified":"2026-08-19T08:51:13","modified_gmt":"2026-08-19T05:51:13","slug":"how-to-remove-index-phproutecommon-home-from-the-opencart-homepage","status":"publish","type":"post","link":"https:\/\/www.firstidea.gr\/en\/blog\/seo-performance\/how-to-remove-index-phproutecommon-home-from-the-opencart-homepage\/","title":{"rendered":"How to Remove index.php?route=common\/home from the OpenCart Homepage"},"content":{"rendered":"\n<div class=\"wp-block-group firstidea-route-insight is-layout-flow wp-block-group-is-layout-flow\">\n\t\n\t<div class=\"wp-block-group opencart-route-answer is-layout-flow wp-block-group-is-layout-flow\">\n\t\t<p class=\"eyebrow wp-block-paragraph\"><span aria-hidden=\"true\"><\/span> The short answer<\/p>\n\t\t<h2 class=\"wp-block-heading\">An OpenCart homepage should have one clean, authoritative address.<\/h2>\n\t\t<p class=\"wp-block-paragraph\">If both <code>\/<\/code> and <code>\/index.php?route=common\/home<\/code> return the same homepage, choose the clean root as canonical, stop generating internal links to the route URL and add <strong>one permanent redirect with no intermediate hop<\/strong> from the exact duplicate to the root.<\/p>\n\t\t<p class=\"wp-block-paragraph\">There is no rule that is safe to paste into every OpenCart installation. The final implementation depends on version, Apache or Nginx, subfolder, multi-store, languages, extensions and which query parameters must be preserved.<\/p>\n\t\t<div class=\"route-switchyard\" aria-hidden=\"true\"><span>URL SWITCHYARD \/ ONE DESTINATION<\/span><div class=\"route-switchyard__input\"><b>\/<\/b><i>preferred<\/i><\/div><div class=\"route-switchyard__input\"><b>index.php?route=common\/home<\/b><i>duplicate<\/i><\/div><em>301<\/em><div class=\"route-switchyard__output\"><b>\/<\/b><i>CANONICAL \/ 200<\/i><\/div><strong>ONE INDEXABLE HOMEPAGE<\/strong><\/div>\n\t<\/div>\n\t\n\n\t<div class=\"wp-block-group route-source-note is-layout-flow wp-block-group-is-layout-flow\"><p class=\"wp-block-paragraph\"><strong>Last technically reviewed: 19 August 2026.<\/strong> This is a diagnosis-first guide. Back up the active configuration, record the current redirect chain and test in staging before changing production.<\/p><\/div>\n\n\t<h2 class=\"wp-block-heading\">What does <code>route=common\/home<\/code> mean in OpenCart?<\/h2>\n\t<p class=\"wp-block-paragraph\">OpenCart uses the <code>route<\/code> query parameter to direct a request to the appropriate controller. The official OpenCart URL library initially builds links as <code>index.php?route=...<\/code> and then allows registered rewrite handlers to transform them. See the <a href=\"https:\/\/github.com\/opencart\/opencart\/blob\/master\/upload\/system\/library\/url.php\" target=\"_blank\" rel=\"noopener\">official URL library source<\/a>.<\/p>\n\t<p class=\"wp-block-paragraph\"><code>common\/home<\/code> is the homepage route. It is not a second business homepage, but it can become a second accessible URL when link generation or the rewrite layer does not consolidate it with the root.<\/p>\n\n\t<h2 class=\"wp-block-heading\">Why does the duplicate URL appear?<\/h2>\n\t<ul class=\"wp-block-list route-cause-list\"><li>The logo, breadcrumb or a module generates a route-based link to <code>common\/home<\/code>.<\/li><li>A theme, extension, OCMOD or VQMod bypasses the expected URL rewrite.<\/li><li>SEO URLs are enabled, but the homepage is not covered by the rewrite handler.<\/li><li>The <code>.htaccess<\/code> file is inactive, misplaced or the server uses Nginx.<\/li><li>Different stores, domains, languages or folders have different routing rules.<\/li><\/ul>\n\t<p class=\"wp-block-paragraph\">The official SEO URL startup controller rewrites known route\/value pairs. When no mapping catches the homepage route, the query can remain. Review the <a href=\"https:\/\/github.com\/opencart\/opencart\/blob\/master\/upload\/catalog\/controller\/startup\/seo_url.php\" target=\"_blank\" rel=\"noopener\">official OpenCart SEO URL controller<\/a>.<\/p>\n\n\t<h2 class=\"wp-block-heading\">Is this a Google penalty?<\/h2>\n\t<p class=\"wp-block-paragraph\">Not automatically. It is still unnecessary duplication: it can split internal signals, create canonical and sitemap inconsistencies, complicate reporting and consume crawl activity on a URL you do not want to maintain. Google recommends consistent canonical signals and treats redirects as a strong consolidation signal in its <a href=\"https:\/\/developers.google.com\/search\/docs\/crawling-indexing\/canonicalization\" target=\"_blank\" rel=\"noopener\">canonicalization documentation<\/a>.<\/p>\n\n\t<h2 class=\"wp-block-heading\">Which URL should be canonical?<\/h2>\n\t<p class=\"wp-block-paragraph\">For a typical root installation, the canonical is the public homepage URL, such as <code>https:\/\/example.com\/<\/code>. For a subfolder, multi-store or language setup, it may be <code>\/shop\/<\/code>, a separate domain or a localized root. Record the decision <strong>for every store and language<\/strong> before writing a redirect.<\/p>\n\t<div class=\"route-request-trace\" aria-hidden=\"true\"><span>CANONICAL DECISION TRACE<\/span><ol><li><b>01<\/b><i>STORE<\/i><em>domain \/ folder<\/em><\/li><li><b>02<\/b><i>LANGUAGE<\/i><em>prefix \/ parameter<\/em><\/li><li><b>03<\/b><i>ROOT<\/i><em>self canonical<\/em><\/li><li><b>04<\/b><i>DUPLICATE<\/i><em>301 once<\/em><\/li><\/ol><strong>DECIDE BEFORE REWRITE<\/strong><\/div>\n\n\t<h2 class=\"wp-block-heading\">What should you inspect before changing anything?<\/h2>\n\t<ol class=\"wp-block-list route-diagnostic-list\"><li>Status code and complete redirect chain for the root and route URL.<\/li><li>Canonical tag and final resolved URL.<\/li><li>Source of internal links: logo, menu, breadcrumb, theme or extension.<\/li><li>XML sitemap, hreflang and language switcher.<\/li><li>Apache, LiteSpeed, Nginx or managed hosting and the active configuration.<\/li><li>OpenCart\/PHP version, multi-store, subfolder, OCMOD\/VQMod and caching\/CDN.<\/li><li>Search Console, access logs and a crawl to identify real variants.<\/li><\/ol>\n\n\t<h2 class=\"wp-block-heading\">The safe order is source, redirect and then signal alignment.<\/h2>\n\t<ol class=\"wp-block-list route-fix-order\"><li><strong>Stop generating the duplicate.<\/strong> Update the logo, menu, theme or extension so new internal links point to the canonical root.<\/li><li><strong>Add an exact redirect.<\/strong> The old route URL should reach the correct root through one permanent hop.<\/li><li><strong>Align the signals.<\/strong> Self-canonical, sitemap, hreflang and internal links must agree.<\/li><li><strong>Test and monitor.<\/strong> Crawl, logs, Search Console and real commerce flows after release.<\/li><\/ol>\n\n\t<h2 class=\"wp-block-heading\">Apache 2.4 example for a root installation.<\/h2>\n\t<p class=\"wp-block-paragraph\">This is a <strong>narrow example<\/strong> for Apache 2.4+, OpenCart installed at the root and the exact <code>route=common\/home<\/code> query. Place it before OpenCart&#8217;s general catch-all rule. The <code>QSD<\/code> flag discards this exact query string and is defined in the official <a href=\"https:\/\/httpd.apache.org\/docs\/2.4\/en\/rewrite\/flags.html#flag_qsd\" target=\"_blank\" rel=\"noopener\">Apache RewriteRule flags<\/a>.<\/p>\n\t<pre class=\"wp-block-code\"><code>RewriteCond %{QUERY_STRING} ^route=common\/home$\nRewriteRule ^index\\.php$ \/ [R=301,L,QSD]<\/code><\/pre>\n\t<p class=\"wp-block-paragraph\">The exact match is deliberate: it does not silently discard <code>language<\/code>, UTM or other parameters. A subfolder needs a different target. Multi-store and separate language roots need their own decisions and tests. The official <a href=\"https:\/\/github.com\/opencart\/opencart\/blob\/master\/upload\/.htaccess.txt\" target=\"_blank\" rel=\"noopener\">OpenCart .htaccess.txt<\/a> documents the general SEO URL setup, not a universal homepage rule.<\/p>\n\n\t<h2 class=\"wp-block-heading\">Nginx does not execute <code>.htaccess<\/code>.<\/h2>\n\t<p class=\"wp-block-paragraph\">The rule must be implemented in the active Nginx configuration by the server administrator or hosting provider. Avoid a generic copy-and-paste snippet: the safe solution varies by <code>server<\/code>, <code>location<\/code>, PHP upstream, subfolder and multi-store. The <a href=\"https:\/\/nginx.org\/en\/docs\/http\/ngx_http_rewrite_module.html\" target=\"_blank\" rel=\"noopener\">official Nginx rewrite module documentation<\/a> explains directive execution order.<\/p>\n\n\t<h2 class=\"wp-block-heading\">Multi-store, languages and subfolders need a route matrix.<\/h2>\n\t<p class=\"wp-block-paragraph\">A redirect to <code>\/<\/code> can send a visitor to the wrong store or language. For every host or prefix, record the input URL, expected canonical, status and whether a parameter is functional. The language switcher should also point to a canonical localized URL rather than recreate <code>common\/home<\/code>.<\/p>\n\n\t<h2 class=\"wp-block-heading\">What about UTM, language and other parameters?<\/h2>\n\t<p class=\"wp-block-paragraph\">Do not remove all queries because one route is a duplicate. UTM parameters usually support attribution, language parameters can be functional and extensions may own others. Classify the parameters first, then choose exact matching or a controlled broader rule.<\/p>\n\n\t<h2 class=\"wp-block-heading\">Is a canonical tag enough without a redirect?<\/h2>\n\t<p class=\"wp-block-paragraph\">A canonical helps, but when the duplicate does not need to remain accessible, a permanent server-side redirect gives users and crawlers a clearer outcome. Google recommends avoiding conflicting signals and describes <a href=\"https:\/\/developers.google.com\/search\/docs\/crawling-indexing\/301-redirects\" target=\"_blank\" rel=\"noopener\">permanent redirects<\/a> for URL changes. A JavaScript redirect or meta refresh is not the right first choice here.<\/p>\n\n\t<h2 class=\"wp-block-heading\">Cache, CDN and redirect caches can hide the result.<\/h2>\n\t<p class=\"wp-block-paragraph\">After the change, purge only the relevant layers and repeat the check without browser cache. Browsers and CDNs can retain a 301, so test in staging before production and keep an exact rollback. Cache purging is not a substitute for a correct rewrite.<\/p>\n\n\t<h2 class=\"wp-block-heading\">Acceptance test: what should happen after the fix?<\/h2>\n\t<div class=\"route-acceptance-matrix\"><span>ACCEPTANCE MATRIX<\/span><div><b>\/<\/b><i>200<\/i><em>self canonical<\/em><\/div><div><b>\/index.php?route=common\/home<\/b><i>301 \u00d7 1<\/i><em>to \/<\/em><\/div><div><b>product \/ category<\/b><i>200<\/i><em>unchanged<\/em><\/div><div><b>cart \/ checkout \/ account<\/b><i>PASS<\/i><em>no regression<\/em><\/div><strong>NO CHAIN \/ NO LOOP \/ NO WRONG LANGUAGE<\/strong><\/div>\n\t<p class=\"wp-block-paragraph\">Also test the non-preferred protocol\/host, trailing-slash policy, sitemap, canonical, hreflang, logo\/menu links, product and category URLs, search, account, cart and checkout. The objective is not merely to hide one address; it is to protect every critical function.<\/p>\n\n\t<h2 class=\"wp-block-heading\">When should you roll back?<\/h2>\n\t<p class=\"wp-block-paragraph\">Roll back if you see a loop, wrong store\/language, loss of a functional query, changes to product\/category URLs, problems in cart\/checkout\/account or a chain longer than one hop. Preserve logs and test cases so the next revision fixes the actual cause.<\/p>\n\t<div class=\"route-rollback-card\" aria-hidden=\"true\"><span>ROLLBACK GATE<\/span><p><b>LOOP<\/b><i>STOP<\/i><\/p><p><b>WRONG STORE \/ LANGUAGE<\/b><i>STOP<\/i><\/p><p><b>CHECKOUT REGRESSION<\/b><i>STOP<\/i><\/p><p><b>ONE CLEAN HOP<\/b><i>RELEASE<\/i><\/p><\/div>\n\n\t<h2 class=\"wp-block-heading\">The most common mistakes are overly broad rules.<\/h2>\n\t<ul class=\"wp-block-list route-mistake-list\"><li>Redirecting every <code>index.php<\/code> request and breaking functional routes.<\/li><li>Using <code>HTTP_HOST<\/code> in a pasted rule without host validation.<\/li><li>Discarding every query parameter without classification.<\/li><li>Redirecting to another redirect instead of the final canonical destination.<\/li><li>Pointing the canonical to the root while sitemap and logo still use the route URL.<\/li><li>Changing production without backup, staging and checkout regression tests.<\/li><\/ul>\n\n\t<h2 class=\"wp-block-heading\">How does Firstidea approach this on a live OpenCart store?<\/h2>\n\t<p class=\"wp-block-paragraph\">We begin with a URL and server audit, identify what generates the duplicate, define a canonical matrix and apply the smallest safe change with rollback. If the issue belongs to wider technical debt, it enters a roadmap. Explore our <a href=\"https:\/\/www.firstidea.gr\/en\/services\/opencart-support\/\">OpenCart support service<\/a>, <a href=\"https:\/\/www.firstidea.gr\/en\/e-shop-development\/e-shop-development-with-opencart\/\">OpenCart eShop development<\/a> and <a href=\"https:\/\/www.firstidea.gr\/en\/services\/website-optimization\/google-ranking-improvement-seo\/\">SEO and organic growth service<\/a>.<\/p>\n\n\t<h2 class=\"wp-block-heading\">Frequently asked questions about OpenCart <code>common\/home<\/code>.<\/h2>\n\t<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>Should I always remove <code>index.php?route=common\/home<\/code>?<\/summary><p class=\"wp-block-paragraph\">When it returns the same homepage as the root and has no separate function, consolidation is preferable. Confirm store, language and server setup first.<\/p><\/details>\n\t<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>Does it affect SEO?<\/summary><p class=\"wp-block-paragraph\">It can create duplicate and conflicting signals. It is not an automatic penalty, but should be resolved through consistent internal links, canonical, sitemap and redirect.<\/p><\/details>\n\t<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>Should I use a 301 or 302?<\/summary><p class=\"wp-block-paragraph\">Use a 301 or another permanent server-side status for permanent consolidation. Temporary behaviour can be useful during testing before the production rule is locked.<\/p><\/details>\n\t<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>Is changing the canonical enough?<\/summary><p class=\"wp-block-paragraph\">Not ideally. If the duplicate has no reason to remain accessible, correct the source of the links and add a permanent redirect while aligning every canonical signal.<\/p><\/details>\n\t<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>Where should the Apache rule go?<\/summary><p class=\"wp-block-paragraph\">Before the general OpenCart catch-all rewrite and only after confirming that this <code>.htaccess<\/code> is active. Back it up and adapt the target to the installation path.<\/p><\/details>\n\t<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>Does the same rule work on Nginx?<\/summary><p class=\"wp-block-paragraph\">No. Nginx does not read <code>.htaccess<\/code>. The logic belongs in the active server configuration and should be implemented by an authorised administrator.<\/p><\/details>\n\t<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>What changes when OpenCart is installed in a subfolder?<\/summary><p class=\"wp-block-paragraph\">The canonical target and RewriteRule path must follow the subfolder. Redirecting to <code>\/<\/code> is wrong if the store homepage is <code>\/shop\/<\/code>.<\/p><\/details>\n\t<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>What about multi-store?<\/summary><p class=\"wp-block-paragraph\">Every domain or store needs its own expected root. A generic rule can send visitors to the wrong storefront.<\/p><\/details>\n\t<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>Can I preserve UTM parameters?<\/summary><p class=\"wp-block-paragraph\">Yes, but that requires logic different from the exact example in this guide. Separate tracking from functional parameters and verify the analytics result.<\/p><\/details>\n\t<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>How do I find which module generates the URL?<\/summary><p class=\"wp-block-paragraph\">Inspect rendered HTML, logo\/menu\/breadcrumb, theme overrides, OCMOD\/VQMod modifications and extensions. A crawl with inlinks helps identify the source.<\/p><\/details>\n\t<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>Should the duplicate be removed from the sitemap?<\/summary><p class=\"wp-block-paragraph\">Yes. The sitemap should contain the canonical root, not the route URL. Apply the same policy to hreflang and important internal links.<\/p><\/details>\n\t<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>How do I confirm the fix is safe?<\/summary><p class=\"wp-block-paragraph\">Test status and chain, canonical and sitemap, run a crawl and regression-test products, categories, search, cart, checkout and account for every store and language.<\/p><\/details>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>A diagnosis-first guide to consolidating the OpenCart homepage with a clean canonical root, exact 301 redirect and safe Apache, Nginx, multi-store and language testing.<\/p>\n","protected":false},"author":0,"featured_media":10481,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_firstidea_insight_topic":"OpenCart SEO","_firstidea_insight_seo_title":"Remove OpenCart common\/home: Canonical & 301 Guide","_firstidea_insight_description":"Remove index.php?route=common\/home safely with a clean OpenCart canonical, exact 301 redirect, Apache\/Nginx guidance and regression tests.","_firstidea_insight_legacy_url":"https:\/\/www.firstidea.gr\/en\/blog\/seo-performance\/how-to-remove-index-phproutecommon-home-from-the-opencart-homepage\/","_firstidea_insight_author":"Firstidea OpenCart & technical SEO team","_firstidea_insight_reviewer":"Firstidea technical and SEO review","_firstidea_insight_status":"evergreen","_firstidea_insight_last_verified":"2026-08-19","_firstidea_insight_legacy_id":4445,"footnotes":""},"categories":[11],"tags":[],"firstidea_insight_hub":[49,49],"class_list":["post-10480","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-seo-performance-en"],"_links":{"self":[{"href":"https:\/\/www.firstidea.gr\/en\/wp-json\/wp\/v2\/posts\/10480","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.firstidea.gr\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.firstidea.gr\/en\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/www.firstidea.gr\/en\/wp-json\/wp\/v2\/comments?post=10480"}],"version-history":[{"count":2,"href":"https:\/\/www.firstidea.gr\/en\/wp-json\/wp\/v2\/posts\/10480\/revisions"}],"predecessor-version":[{"id":10492,"href":"https:\/\/www.firstidea.gr\/en\/wp-json\/wp\/v2\/posts\/10480\/revisions\/10492"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.firstidea.gr\/en\/wp-json\/wp\/v2\/media\/10481"}],"wp:attachment":[{"href":"https:\/\/www.firstidea.gr\/en\/wp-json\/wp\/v2\/media?parent=10480"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.firstidea.gr\/en\/wp-json\/wp\/v2\/categories?post=10480"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.firstidea.gr\/en\/wp-json\/wp\/v2\/tags?post=10480"},{"taxonomy":"firstidea_insight_hub","embeddable":true,"href":"https:\/\/www.firstidea.gr\/en\/wp-json\/wp\/v2\/firstidea_insight_hub?post=10480"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}