PrestaShop has one quirk that causes more trouble here than anything else: the .htaccess file is not entirely yours. The back office generates it, and regenerates it every time you touch the URL configuration. Put your redirects in the wrong place and they vanish without warning and without a trace in any log.
First: friendly URLs
Before redirecting anything, check under Shop Parameters → Traffic & SEO that friendly URLs are on. With URLs like index.php?id_product=42 no redirect is worth writing: you have no stable paths to map.
Option 1: .htaccess, carefully
It is the direct route and the fastest for a handful of redirects. The syntax is ordinary Apache:
# A single URL Redirect 301 /old-category https://yourshop.com/new-category # A pattern, with a regular expression RewriteEngine On RewriteRule ^old-products/(.*)$ /catalogue/$1 [R=301,L]
PrestaShop writes its own block into .htaccess between start and end comment markers, and rewrites that block wholesale when you regenerate the file from Traffic & SEO. Your rules have to live outside it. And after every regeneration, open the file again and confirm they are still there.
A second warning matters just as much: this only works on Apache and LiteSpeed. If your hosting runs NGINX there is no .htaccess at all and the rules have to go into the server configuration, which shared hosting normally does not let you reach.
Option 2: a redirect module
The PrestaShop Addons marketplace has several modules for managing redirects from the back office. They pay off in three specific situations, and not before:
- •When the volume is high and you need to import a whole map rather than hand-edit a file.
- •When whoever maintains the shop has no FTP access and no comfort with Apache.
- •When you are on NGINX and .htaccess simply does not exist.
In exchange, a module-managed redirect resolves inside PHP rather than at the server: it is slightly slower and depends on the module staying maintained. For stable, permanent rules, .htaccess remains the sturdier option.
Multistore: the fault you cannot see
With several shops in one installation, they all share the .htaccess at the root. A rule written without conditioning the domain applies to all of them, and you end up redirecting a path on yourshop.fr that should only have redirected on yourshop.com.
# Condition every rule on its shop's domain
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www\.)?yourshop\.com$ [NC]
RewriteRule ^old-offer$ /promotions [R=301,L]
RewriteCond %{HTTP_HOST} ^(www\.)?yourshop\.fr$ [NC]
RewriteRule ^offre-ancienne$ /promotions [R=301,L]The chains PrestaShop typically produces
| Where the chain comes from | How to resolve it |
|---|---|
| Your redirect plus PrestaShop’s canonical | PrestaShop redirects to the product’s canonical URL on its own. If your rule points at a non-canonical variant, two hops chain up: point straight at the canonical. |
| www and non-www not unified | The domain redirect stacks on top of yours. Unify www/non-www and http/https in a single rule first, and have the rest point at the final format already. |
| Rules piled up from old migrations | Each migration leaves its layer. Follow the chain from the oldest URL and rewrite the first rule to point at the current destination. |
Check that they survive
In PrestaShop you have to verify twice: once when you create the rules and again after any change to the URL configuration, because that is where they get lost. Take the old URLs, follow the whole chain and confirm there is a single hop to the final destination.
Try the tool for free
Analyze your URLs with 301 Redirect Checker by iRankly. No sign-up, no credit card.
If you are on another platform, or want the detail of each redirect type: