Why my htacess rewrite return 404?

I am assuming that the stuff in “def/products” is not handled by WordPress.

Try reversing the index.php and abc/products rules, like so:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^abc/products-(.+)$ def/products-$1 [R=301,L]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wp/index.php [L]
</IfModule>

.htaccess is read and executed line by line. It may help to have your rule execute before WordPress’s. That is the way I usually handle it.

I say ‘try’ because I can usually get these to work but sometimes not the first time. 🙂