Вы можете просто добавить catch all как последний возможный текст и сопоставить его с 404.php (или чем угодно).
RewriteRule ^(.*)$ 404.php?attempt=$1 [L,NC]
Просто поместите это в конец ваших переписываний.
РЕДАКТИРОВАТЬ:
Я проверил это сам (я обычно не использую переписывает таким образом):
RewriteEngine on
RewriteRule ^product/([0-9]+).*/?$ product.php?pid=$1 [L]
RewriteRule ^category/([0-9]+).*/?$ category.php?cid=$1 [L]
RewriteRule ^(.*)$ 404.php?attempt=$1 [L]
И также обнаружил, что404 будет поражен каждый раз.Видимо, это ожидаемое поведение .htaccess.(https://stackoverflow.com/a/3642271/603184)
Получается, что вам нужно прекратить сопоставление при попадании в файл product / category.php, это можно сделать, добавив:
RewriteRule ^category.php$ - [L]
RewriteRule ^product.php$ - [L]
Перед перенаправлением 404. Результатв:
RewriteEngine on
RewriteRule ^product/([0-9]+).*/?$ product.php?pid=$1 [L]
RewriteRule ^category/([0-9]+).*/?$ category.php?cid=$1 [L]
RewriteRule ^category.php$ - [L]
RewriteRule ^product.php$ - [L]
RewriteRule ^(.*)$ 404.php?attempt=$1 [L]