RewriteRule ^([a-z0-9-_]+)/?$ /index.php?mainp=$1 [QSA,NC,L]
RewriteRule ^([a-z0-9-_]+)/([a-z0-9-_]+)/?$ /index.php?mainp=$1&subp=$2 [QSA,NC,L]
RewriteRule ^([a-z0-9-_]+)/([a-z0-9-_]+)/([a-z0-9-_]+)/?$ /index.php?mainp=$1&subp=$2&id=$3 [QSA,NC,L]
Добавляя ?
перед $
, вы делаете конечный слеш необязательным, поэтому 1 из таких правил будет охватывать 2 ваших (строка 1 = 1 & 2; строка 2 = 3 & 4, строка 3 = 5 & 6 (6 нет в списке, но, думаю, оно существует))
Я заменил &%{QUERY_STRING}
на [QSA]
флаг - делает то же самое (может даже считаться более удобным).
Я также удалил A-Z
из шаблонов и заменил флаг [NC]
(NC = игнорировать регистр). Это делает все правила немного короче и, следовательно, немного легче для чтения.