Woodymon:
...
Redirect 301 /shop/index.php?main_page=product_info&products_id=392 http://www.domain.com/shop/index.php?main_page=product_info&products_id=394
...
IMHO the best approach for an e-commerce website in regards to the customer experience would be to never redirect from one product to another product. I'm am however, not going to turn this support thread into a discussion on the topic. There are numerous other threads here on the Zen Cart forums and on the internet in general regarding WHY and alternative methods of handling products when they are: discontinued, no longer carried, or replaced by a newer version.
Just a warning (not targeted to the OP specifically), one should never adjust web server directives without thorough knowledge of the directives (and the implications of using the directives). Just placing directives without understanding the directives and how the server processes the directives can result in a major headache (and potentially unanticipated downtime). To properly place and use web server directives it is imperative one know if there are any server-wide directives, vhost directives, or other directives in .htaccess files (or parent folders) and how those directives will (or will not) impact any new directives being added.
If it is absolutely necessary to redirect one product to another product there are a few different methods. The first is to rewrite the request using a mod_rewrite directive (changing the product_id), and let Ultimate URLs issue the 301 redirect. The second is to use mod_rewrite to tell Apache to issue the 301 redirect. I would recommend the first method, letting Ultimate URLs handle the 301 redirect unless there is a very compelling reason to do otherwise.
One should place any custom 301 redirects in the section of the .htaccess labeled "Add any custom 301 redirects". This is also the correct place to add any custom mod_rewrite directives such as folder exclusions (for example when a test environment is located at /test-zencart/).
The following examples assume no other modifications to the supplied .htaccess files, no .htaccess files in parent folders, and no conflicting server / vhost directives.
Method #1 (Recommended):
###############################################################################
# Add any custom 301 redirects
###############################################################################
# Notes:
#
# In general these should be few and far between. If you use a RewriteRule
# be sure to add the L flag to let Apache mod_rewrite know to stop processing
# and skip any RewriteRules defined later in the .htaccess file.
###############################################################################
# Rewrite the request internally. Will catch all requests to the old page (stock Zen Cart and Ultimate URLs).
# This option will not result in "redirect loops" (even if the product name or URL is changed in the future).
# Enable automatic redirects in the Ultimate URLs configuration to issue a 301 to the alternative URL.
RewriteCond %{QUERY_STRING} main_page=product_info
RewriteCond %{QUERY_STRING} products_id=392
RewriteRule ^(.*)$ index.php?main_page=product_info&products_id=394
Method #2 (Not Recommended):
###############################################################################
# Add any custom 301 redirects
###############################################################################
# Notes:
#
# In general these should be few and far between. If you use a RewriteRule
# be sure to add the L flag to let Apache mod_rewrite know to stop processing
# and skip any RewriteRules defined later in the .htaccess file.
###############################################################################
# Redirect the requests via Apache. Will require multiple entries and updating every time the URL changes.
# This option can result in "redirect loops" (especially if the product name or URL changes in the future).
# Apache issues the redirect and does not use Ultimate URLs to determine the correct alternative URL.
RewriteCond %{QUERY_STRING} main_page=product_info
RewriteCond %{QUERY_STRING} products_id=392
RewriteRule ^(.*)$ http://www.example.com/actual-url-to-the-new-product-p-394.html [R=301,L]
RewriteRule ^actual-url-to-the-old-product-p-392\.html$ http://www.example.com/actual-url-to-the-new-product-p-394.html [R=301,L]
All changes should be vetted in a non-production environment (testing website) before being applied to a production environment (live website).
NOTE: Without knowing the specific old and the specific new URL, no optimizations can be safely added to the second method (and one will be required to repeat the second RewriteRule for each possible alternative URL for the old product). If they were known some could possibly be applied. Not going to spend alot of time on these as using the first method is a better long term approach with Ultimate URLs.