Every OpenCart fix we catalog

SEOLZ catalogs 41 fixes for OpenCart across 4 areas — SEO, answer-engine readiness, accessibility, security and site-health. Each lists the exact steps for OpenCart, with a link to the official docs.

SEO · 14 fixes

Duplicate titleModerate effort

Write a unique, descriptive title tag for every page on your store so no two pages share the same title.

On OpenCart

  1. For products: go to Catalog → Products → edit a product → 'SEO' tab → enter a value in 'Meta Tag Title'.
  2. For categories: Catalog → Categories → edit a category → 'SEO' tab → 'Meta Tag Title'.
  3. For information pages: Catalog → Information → edit a page → 'Meta Tag Title'.
  4. For the default title on the homepage and layout: System → Settings → your store → 'Meta Tag Title'.
  5. Install an SEO extension from the OpenCart marketplace (e.g. SEO Pack Pro) to manage bulk title updates and set dynamic title templates across your catalog.
Images missing altModerate effort

Add descriptive alt text to every image on your store so search engines can understand them and all shoppers can access your content.

On OpenCart

  1. FOR PRODUCT IMAGES: Admin > Catalog > Products > open a product > Image tab. The main image alt text is pulled from the Product Name by default; for gallery images, there is no native alt field — install the 'Image Alt Tag' extension from the OpenCart marketplace to add per-image alt fields.
  2. FOR CMS/BANNER IMAGES: Admin > Design > Banners > edit banner > fill in the 'Title' field, which renders as the alt attribute.
Missing canonicalModerate effort

Add a self-referencing canonical tag to every page so Google knows which URL is the "official" version of that content.

On OpenCart

  1. OpenCart does not output canonical tags by default — install an SEO extension such as 'SEO Extension by OpenCart.com' or 'Better SEO' from the OpenCart Marketplace.
  2. After installing, navigate to the extension's settings in Extensions → Extensions → SEO and enable canonical tags for product, category, and information pages.
  3. Alternatively, edit `catalog/view/theme/your-theme/template/common/head.twig` and add: `<link rel="canonical" href="{{ canonical }}">`, passing the canonical URL from the controller.
  4. Clear the theme cache under Dashboard → (developer settings) → Theme → Refresh after making template changes.
Missing meta descriptionQuick win

Write a unique meta description of 120–160 characters for every page so Google has compelling snippet text to show in search results.

On OpenCart

  1. For a product: Admin → Catalog → Products → click the product → 'SEO' tab (or 'Data' tab depending on version) → fill 'Meta Tag Description' → Save.
  2. For a category: Admin → Catalog → Categories → click the category → 'SEO' or 'Data' tab → fill Meta Tag Description → Save.
  3. For information pages: Admin → Catalog → Information → click the page → fill Meta Tag Description → Save.
Missing og descriptionQuick win

Add an og:description meta tag to every page so social platforms display a compelling preview when your store's links are shared.

On OpenCart

  1. Admin → Catalog → Products → select a product → click the 'SEO' tab (or 'Data' tab depending on version) → fill in 'Meta Tag Description'.
  2. OpenCart's default Storefront themes render og:description from this value. Check catalog/view/theme/[your-theme]/template/common/head.twig (or head.tpl in older versions) for the og:description meta tag.
  3. If missing from the template, add: {% if description %}<meta property="og:description" content="{{ description }}">{% endif %} inside the <head> block.
  4. For categories: Catalog → Categories → select category → fill in 'Meta Tag Description'.
  5. Install an SEO extension from the OpenCart marketplace (search 'Open Graph') for a no-code solution.
  6. Validate with Facebook Sharing Debugger after saving.
Missing titleQuick win

Add a unique, descriptive title tag (30–60 characters) to every page that is missing one.

On OpenCart

  1. For a product: go to Catalog → Products → select the product → click the 'SEO' tab → fill in the 'Meta Tag Title' field.
  2. For a category: Catalog → Categories → select the category → 'SEO' tab → 'Meta Tag Title'.
  3. Click Save.
Noindex detectedQuick win

Remove or replace the `noindex` directive on any page you want Google to find and rank, then verify the change with Google Search Console.

On OpenCart

  1. OpenCart does not natively output noindex tags — check any installed SEO extensions (e.g., SEO Extension Pro, OpenCart SEO) in Admin → Extensions → Extensions for a per-page or site-wide noindex toggle.
  2. Check your theme's `header.twig` (or `header.tpl` for older versions) in the `/catalog/view/theme/your-theme/template/common/` directory for any hard-coded robots meta tags and remove them.
Seo category description missingQuick win

Write a unique 100–200 word description for every product category page explaining what it contains and who it's for.

On OpenCart

  1. In your OpenCart admin, go to Catalog → Categories.
  2. Click 'Edit' on the relevant category.
  3. In the 'General' tab, enter your category description in the 'Description' rich-text field.
  4. Switch to the 'SEO' tab (or 'Data' tab depending on version) to add a meta description.
  5. Click 'Save'.
Seo category description thinModerate effort

Expand your category page description to at least 150–300 words of genuinely useful, keyword-rich content that explains what shoppers will find in the category.

On OpenCart

  1. Go to Admin → Catalog → Categories.
  2. Click 'Edit' next to the category.
  3. Under the 'General' tab, locate the 'Description' field (a full HTML/WYSIWYG editor).
  4. Write or paste your expanded description.
  5. Click 'Save'.
  6. Check the live category page to confirm it displays; it is output via the theme's category template using the $description variable.
Seo product image alt filenameModerate effort

Replace filename-based alt text on product images with short, descriptive phrases that accurately describe each image's content.

On OpenCart

  1. Go to Catalog → Products in the admin and open a product.
  2. Click the 'Image' tab.
  3. OpenCart does not have a native alt text field per image — install a free extension such as 'SEO Image Alt Tags' from the OpenCart marketplace to add this capability.
  4. Once installed, follow the extension's interface to set descriptive alt text for each product image.
  5. Alternatively, edit your product image template file (catalog/view/theme/[your-theme]/template/product/product.twig) to output a dynamic alt attribute using the product name and option values.
Seo product single imageModerate effort

Add at least 4 high-quality product images (multiple angles, detail shots, and lifestyle/in-use photos) to every product listing to increase click-through rates and conversions.

On OpenCart

  1. Go to Admin → Catalog → Products → Edit the product.
  2. Click the 'Image' tab within the product edit screen.
  3. The top image is the 'Main Image'. Below it, use the 'Additional Images' section and click '+' to add more images from the file manager.
  4. OpenCart does not natively support per-image alt text in older versions — use an extension such as 'Product Additional Image Alt Tag' from the OpenCart Marketplace to add this capability.
  5. Save the product.
Seo variant urls in sitemapModerate effort

Remove product variant URLs (e.g. ?variant=, ?sku=) from your XML sitemap so only the canonical product page URL is submitted to Google.

On OpenCart

  1. OpenCart does not include a built-in XML sitemap generator — you are likely using an extension. Go to Extensions → Extensions → choose type 'SEO' or search the extension list for your sitemap extension → Edit its settings.
  2. In the sitemap extension settings, look for an option to exclude product option or variant query-parameter URLs and enable it.
  3. Verify canonical tags: in your product.twig (or product.tpl in older versions) template, ensure a canonical tag is output pointing to the clean product URL without query parameters.
  4. Regenerate the sitemap from the extension interface and resubmit in Google Search Console.
Seo variant urls not canonicalizedModerate effort

Add a canonical tag to every product variant URL pointing back to the base product page, so Google consolidates ranking signals onto one authoritative URL instead of splitting them across hundreds of near-duplicate pages.

On OpenCart

  1. OpenCart does not add canonical tags to variant/option URLs by default.
  2. Install an SEO extension from the OpenCart Marketplace such as 'SEO Canonical URL' or a comprehensive SEO module that supports product canonicals.
  3. Alternatively, edit catalog/view/theme/[your-theme]/template/product/product.twig (OpenCart 3+) and add inside the <head> block: <link rel="canonical" href="{{ canonical }}"> then set the $canonical variable in the product controller (catalog/controller/product/product.php) to the base product URL without option parameters.
  4. After making changes, go to Admin → Dashboard and use the cache-clearing option, then verify with page source inspection.
Title too shortQuick win

Expand your page title to between 50 and 60 characters so it displays fully in Google search results and gives shoppers a clear reason to click.

On OpenCart

  1. In the admin panel, navigate to Catalog → Products (or Categories).
  2. Open the item and go to the 'SEO' tab (or 'Data' tab depending on version).
  3. Update the 'Meta Tag Title' field with your new 50–60 character title.
  4. Click 'Save'.

Accessibility (WCAG) · 8 fixes

Aria required childrenModerate effort

Ensure every ARIA parent role contains only its required, permitted child roles — and remove focusable elements (e.g. tabindex on img or a) that are not allowed inside that ARIA context.

On OpenCart

  1. Connect via FTP/SFTP to your server. Template files are in catalog/view/theme/[your-theme]/template/.
  2. Identify the relevant .twig or .tpl file (e.g. common/header.twig, product/category.twig).
  3. Edit the file to add the correct child role attributes to children of ARIA parent roles, or remove tabindex from img/a elements that are illegal children.
  4. Save the file and hard-refresh your browser. Test with axe DevTools.
Button nameModerate effort

Add a visible or programmatically accessible name to every button so screen readers can announce what it does.

On OpenCart

  1. Navigate to your theme folder: catalog/view/theme/<your-theme>/template/. Open the relevant .twig or .tpl file (e.g. common/header.twig, product/product.twig).
  2. Locate the <button> element and add aria-label="Descriptive name" to the tag.
  3. Save, refresh the store cache if applicable, and verify with axe DevTools.
Html has langQuick win

Add a valid `lang` attribute to the `<html>` element so browsers and assistive technologies know what language your page is written in.

On OpenCart

  1. In OpenCart, the root HTML is output by your theme's layout template, typically `catalog/view/theme/<your-theme>/template/common/html.twig` or `html.tpl` depending on your version.
  2. Open the file via FTP or a file manager (use a custom theme copy, not the default theme).
  3. Find the `<html` tag and update it to include the language code variable, for example: `<html lang="{{ language_code }}">` (Twig) or `<html lang="<?php echo $language_code; ?>">`.
  4. Ensure the controller passes the language ISO code to the view — check `catalog/controller/common/html.php` to confirm `$data['language_code']` is set from the active language.
  5. Save, then verify via View Source on the storefront.
Landmark no duplicate bannerModerate effort

Ensure your page has only one banner landmark (a single `<header>` element or `role="banner"`) so assistive technologies can navigate your site correctly.

On OpenCart

  1. In the OpenCart admin, go to Design → Theme Editor, or access the files directly via FTP at catalog/view/theme/<your-theme>/template/common/header.tpl (or header.twig for OpenCart 3+).
  2. Open header.twig/header.tpl and search for '<header' and 'role="banner"'. There should be only one.
  3. Identify any module or extension that is injecting a second <header> (check catalog/view/theme/<theme>/template/ for module templates).
  4. Change duplicate <header> elements to <div> and remove role="banner" from any that are not the primary site header.
  5. Refresh the OpenCart cache under Admin → Dashboard → (gear icon) → Refresh, then verify with axe DevTools.
Landmark one mainQuick win

Add a single `<main>` landmark element (or `role="main"`) to every page so that screen-reader users and assistive technologies can skip directly to the primary content.

On OpenCart

  1. Open your theme's main layout file, typically `catalog/view/theme/<your-theme>/template/common/header.tpl` (OpenCart 2.x) or `header.twig` (OpenCart 3.x+).
  2. At the bottom of the header template (just before the main content inclusion), add `<main id="main-content" role="main">`.
  3. Open `catalog/view/theme/<your-theme>/template/common/footer.tpl` (or `.twig`) and add the closing `</main>` tag near the top, before the `<footer>` tag.
  4. Add a skip link as the first element after `<body>` in the header template.
  5. Refresh the OpenCart cache and verify with axe DevTools.
Meta viewportQuick win

Remove `user-scalable=no` (and any `maximum-scale` value below 5) from your site's `<meta name="viewport">` tag so visitors can pinch-to-zoom on mobile devices.

On OpenCart

  1. Via FTP, open `catalog/view/theme/<your-theme>/template/common/header.twig` (OpenCart 3+) or `header.tpl` (OpenCart 2).
  2. Find the `<meta name="viewport">` line and remove `user-scalable=no` / fix `maximum-scale`.
  3. Save and refresh your store on a mobile browser to confirm zoom works.
Meta viewport largeQuick win

Remove or raise the `maximum-scale` value in your site's `<meta name="viewport">` tag so mobile users can pinch-to-zoom freely.

On OpenCart

  1. Open catalog/view/theme/<your-theme>/template/common/header.twig (OpenCart 3+) or header.tpl (OpenCart 2).
  2. Find `<meta name="viewport"` and correct the content attribute.
  3. Save and refresh your storefront cache.
Select nameModerate effort

Add a descriptive, programmatically associated label to every `<select>` dropdown element on the site so assistive technologies can announce its purpose to users.

On OpenCart

  1. Navigate to your OpenCart store's theme files. The default theme path is 'catalog/view/theme/YOUR-THEME/template/'.
  2. Find the template with the offending <select> (e.g. 'product/product.tpl' for variant selectors, 'checkout/checkout.tpl' for address dropdowns).
  3. Add a <label for="MATCHING-ID">Descriptive text</label> before each bare <select>, or add aria-label="Descriptive text" directly on the element.
  4. Save, clear caches from Admin → Dashboard → the blue cog icon → Refresh, then verify with axe DevTools.

Security (OWASP) · 11 fixes

Https not availableQuick win

Enable HTTPS by installing a valid SSL/TLS certificate and redirecting all HTTP traffic to the secure HTTPS version of your store.

On OpenCart

  1. Install an SSL certificate on your server via your hosting panel or Let's Encrypt.
  2. Open your OpenCart config.php (root directory) and config.php inside the admin/ directory.
  3. Change the HTTP_SERVER and HTTPS_SERVER constants so both begin with https://.
  4. In the OpenCart Admin, go to System → Settings → Edit your store → Server tab and set 'Use SSL' to 'Yes'.
  5. Add a 301 redirect in .htaccess: RewriteEngine On / RewriteCond %{HTTPS} off / RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Info disclosure serverQuick win

Remove or obscure the Server HTTP response header so your web server software name and version are no longer exposed to the public internet.

On OpenCart

  1. OpenCart is self-hosted — the `Server` header is controlled by the web server, not OpenCart itself.
  2. For Apache hosting: edit `.htaccess` or `httpd.conf` — add `ServerTokens Prod` and `ServerSignature Off`, then restart Apache.
  3. For nginx: add `server_tokens off;` to your nginx config, then reload.
  4. Verify with browser DevTools or `curl -I https://yourstore.com`.
Info disclosure x powered byQuick win

Remove or mask the X-Powered-By HTTP response header to stop advertising your server technology stack to attackers.

On OpenCart

  1. Add `header_remove('X-Powered-By');` in OpenCart's index.php entry file (root of your installation) near the top, after the opening PHP tag.
  2. For Apache: Add `Header unset X-Powered-By` to your .htaccess file.
  3. For Nginx: Add `more_clear_headers 'X-Powered-By';` to your server block config.
  4. Set `expose_php = Off` in php.ini to stop PHP from injecting its version string.
Insecure cookieModerate effort

Set the HttpOnly, Secure, and SameSite=Strict flags on every session and CSRF cookie your store sets so they cannot be stolen by malicious scripts or sent over unencrypted connections.

On OpenCart

  1. Open system/library/session.php and system/library/cart.php in your OpenCart installation (via FTP or Admin → Developer Tools if available).
  2. Find the `setcookie()` calls and add the flags: `setcookie($name, $value, ['expires' => time()+$expire, 'path' => '/', 'secure' => true, 'httponly' => true, 'samesite' => 'Strict']);`
  3. In config.php and admin/config.php, ensure `define('HTTPS_SERVER', 'https://...')` uses HTTPS.
  4. Search for any additional `setcookie()` calls in catalog/controller/startup/session.php and apply the same flags.
  5. Clear the OpenCart cache (Admin → Dashboard → blue cog icon → Refresh) and verify cookie flags in DevTools.
Missing referrer policyQuick win

Add a `Referrer-Policy: strict-origin-when-cross-origin` HTTP response header to every page so browsers control what referrer information is sent with requests.

On OpenCart

  1. Edit your `.htaccess` file (Apache) and add: `Header always set Referrer-Policy "strict-origin-when-cross-origin"` within `<IfModule mod_headers.c>` block.
  2. For Nginx, add `add_header Referrer-Policy "strict-origin-when-cross-origin" always;` in the server block.
  3. Alternatively, edit `catalog/view/theme/your-theme/template/common/header.twig` (OpenCart 3+) to add the meta tag inside `<head>`: `<meta name="referrer" content="strict-origin-when-cross-origin">`.
  4. Verify with browser DevTools.
Missing strict transport securityQuick win

Add an HTTP Strict-Transport-Security (HSTS) response header with at least `max-age=31536000; includeSubDomains` to every HTTPS response your store sends.

On OpenCart

  1. OpenCart runs on Apache/Nginx — add HSTS at the web server config or .htaccess level.
  2. Apache: In your .htaccess or VirtualHost (SSL section) add: `Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"`.
  3. Nginx: In your SSL server block add: `add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;`
  4. Reload the web server. Verify with browser DevTools.
Missing x content type optionsQuick win

Add the `X-Content-Type-Options: nosniff` HTTP response header to every page of your store so browsers never guess at file types.

On OpenCart

  1. For Apache: add 'Header always set X-Content-Type-Options "nosniff"' to the .htaccess file in your OpenCart root directory.
  2. For Nginx: add 'add_header X-Content-Type-Options nosniff always;' to your server {} block.
  3. Alternatively, edit OpenCart's index.php or a system startup file to add the PHP header() call: header('X-Content-Type-Options: nosniff'); — place it before any output.
  4. Verify in browser dev-tools after deploying.
Missing x frame optionsQuick win

Add an X-Frame-Options HTTP response header set to DENY or SAMEORIGIN to prevent your store's pages from being embedded in iframes on other websites.

On OpenCart

  1. Open the .htaccess file in the root of your OpenCart installation and add: Header always set X-Frame-Options SAMEORIGIN
  2. If your host uses Nginx, add 'add_header X-Frame-Options SAMEORIGIN always;' to the server block for your domain.
  3. Some OpenCart hosting control panels (cPanel/Plesk) allow adding custom headers under 'Apache Handlers' or 'HTTP Headers' modules — look for a Headers section in your cPanel.
  4. Verify via DevTools → Network → Response Headers.
Ssl cert expiring soonQuick win

Renew your SSL/TLS certificate before it expires to keep your store secure, trusted, and visible in search results.

On OpenCart

  1. Renew the SSL certificate through your hosting control panel or Let's Encrypt CLI.
  2. After renewal, update OpenCart's config files: in /config.php and /admin/config.php, ensure 'HTTP_SERVER' and 'HTTPS_SERVER' constants use https://.
  3. In Admin → System → Settings → Your Store → Server tab, set 'Use SSL' to 'Yes'.
Ssl not accessibleModerate effort

Enable HTTPS on your store by opening port 443 and installing a valid SSL/TLS certificate so every page is served over a secure connection.

On OpenCart

  1. Ensure port 443 is open on your server and a valid SSL certificate is installed.
  2. Edit your OpenCart config.php and admin/config.php files: change the HTTP_SERVER and HTTPS_SERVER constants to use https://.
  3. In Admin → Settings → Your Store → Server tab, enable 'Use SSL' and set the SSL URL to your https:// address.
  4. Optionally add an HTTP→HTTPS redirect in your .htaccess file.
Weak spfQuick win

Add a hard-fail (-all) or soft-fail (~all) mechanism to your SPF DNS record so that mail servers are explicitly told to reject or flag email from senders not listed in your record.

On OpenCart

  1. OpenCart does not manage DNS. Edit SPF at your registrar or hosting DNS panel (e.g. cPanel Zone Editor).
  2. Identify what mail service OpenCart is configured to use: Admin → System → Settings → Mail tab. Include that service's SPF include value in your record.
  3. Append -all at the end and save.

Site Lifecycle · 8 fixes

Cms versionModerate effort

Identify your ecommerce platform and CMS version, then ensure it is always kept up to date to protect your store from security vulnerabilities and avoid loss of vendor support.

On OpenCart

  1. Log in to OpenCart Admin → Dashboard: the version number is shown in the bottom footer of the admin panel.
  2. Download the latest OpenCart release from the official OpenCart website and follow the official upgrade guide to apply it via FTP/SFTP.
  3. Back up your database and all files before any upgrade.
  4. After upgrading, go to Admin → Dashboard and verify the version number has changed, then test all storefront functions.
Html langQuick win

Add a correct `lang` attribute to your site's `<html>` tag so browsers, search engines, and assistive technologies know what language your store is written in.

On OpenCart

  1. In OpenCart, the HTML wrapper is in the theme's header template file, typically catalog/view/theme/<your-theme>/template/common/header.twig (or header.tpl for older versions).
  2. Open that file via Admin › Design › Theme Editor, or via FTP.
  3. Find the <html opening tag and add the lang attribute. OpenCart passes language data to templates; use the language code variable, e.g.: <html lang="{{ language_code }}"> or hard-code your language: <html lang="en">.
  4. Save the file and clear the OpenCart cache via Admin › Dashboard › cog icon › Refresh, then verify via View Page Source.
Lifecycle oos schema not updatedModerate effort

Update the `offers.availability` field in your Product schema to `OutOfStock` (or `PreOrder`/`Discontinued`) whenever a product sells out, so Google's data matches your real inventory.

On OpenCart

  1. OpenCart does not output Product schema by default. If your theme or an extension adds JSON-LD, locate the template file (usually catalog/view/theme/[theme]/template/product/product.twig or .tpl) and find the schema block.
  2. Replace any hard-coded 'InStock' value with a PHP/Twig conditional that reads the product's quantity: {% if product.quantity > 0 %}https://schema.org/InStock{% else %}https://schema.org/OutOfStock{% endif %}.
  3. If using an SEO extension (e.g. 'OpenCart SEO Pack', 'D_OPENCART SEO'), check the extension's settings in Admin > Extensions > Modules > [Extension] for a structured data or schema section, and confirm it uses live stock data.
  4. Set the product's quantity to 0 in Admin > Catalog > Products > edit product > Data tab > Quantity field to trigger the out-of-stock state.
  5. Validate with Google's Rich Results Test.
Lifecycle orphaned productsModerate effort

Add internal links from category pages, navigation, and related-product sections to every product page so crawlers and shoppers can find them without relying solely on your sitemap.

On OpenCart

  1. In the OpenCart admin, go to Catalog → Products. Add the 'Categories' filter and look for products with no categories listed.
  2. Click Edit on each orphaned product, go to the 'Links' tab, and assign it to one or more relevant categories.
  3. Ensure those categories appear in your navigation: go to Design → Menus (or your theme's menu settings) and confirm the relevant categories are included.
  4. For related products: on the product edit page, go to the 'Links' tab and add related products in the 'Related Products' field.
  5. Consider installing an extension like 'SEO Related Products' from the OpenCart Marketplace to automate related-product sections.
Mixed contentModerate effort

Audit every page, asset, and third-party embed on your store to ensure no HTTP resources are loaded on HTTPS pages, and fix any mixed-content violations before they silently break security warnings or block content in visitors' browsers.

On OpenCart

  1. In the admin panel, go to System → Settings → your store → Server tab and ensure 'Use SSL' is set to 'Yes'.
  2. In your config.php and admin/config.php files (root of your OpenCart installation), update HTTP_SERVER and HTTPS_SERVER constants to use https:// URLs.
  3. Search your active theme's template files (/catalog/view/theme/your-theme/) for hardcoded http:// asset URLs and update to https://.
  4. In the admin, check any CMS pages (Design → Layouts or Information pages) and product descriptions for HTTP image/media URLs inserted via the text editor; update to HTTPS.
  5. For third-party extensions that add scripts or iframes, update their configuration or embed codes to use HTTPS versions.
  6. Flush the theme cache (Dashboard → Developer → Theme) and verify with browser DevTools.
Mobile viewportQuick win

Confirm your store has a correct responsive viewport meta tag so it displays properly on phones and tablets.

On OpenCart

  1. Locate your theme's header template, typically at catalog/view/theme/<your-theme>/template/common/header.twig (OpenCart 3+) or header.tpl (older versions).
  2. Search for 'viewport'. Add the correct tag in the <head> section if missing: <meta name="viewport" content="width=device-width, initial-scale=1">.
  3. Save the file and clear OpenCart's cache via Admin → Dashboard → the blue refresh button, or by deleting contents of system/storage/cache/.
  4. Verify with Google's Mobile-Friendly Test.
Server versionModerate effort

Remove or suppress the Server version header so your web server software and version number are no longer exposed in every HTTP response.

On OpenCart

  1. OpenCart is self-hosted; apply the fix at the web server and PHP layer.
  2. On Apache: edit .htaccess in the OpenCart root — add `Header unset X-Powered-By` and `ServerSignature Off`. Request `ServerTokens Prod` from your host.
  3. On Nginx: add `server_tokens off;` in nginx.conf or site block.
  4. Set `expose_php = Off` in php.ini.
  5. Verify the change with browser DevTools after restarting the server.
Ssl expiryQuick win

Monitor your SSL/TLS certificate expiry date and set up auto-renewal so your store never goes offline or shows a security warning to shoppers.

On OpenCart

  1. SSL is managed by your hosting provider — log into cPanel/Plesk and confirm auto-renewal is on for your certificate.
  2. After renewal, verify OpenCart Admin → System → Settings → your store → Server tab → 'Use SSL' is set to 'Yes'.
  3. Update your config.php and admin/config.php files to use https:// in the HTTP_SERVER and HTTPS_SERVER constants if they were not already.