Você precisa adicionar o sinalizador L
('last') ao primeiro RewriteRule
:
RewriteRule ^/detail/(.*)$ detail.php?name=$2 [L,QSA]
De acordo com a documentação , esse sinalizador:
Stop the rewriting process here and don't apply any more rewrite rules. This corresponds to the Perl last command or the break command in C. Use this flag to prevent the currently rewritten URL from being rewritten further by following rules.
Sem isso, o Apache continua a aplicar a segunda regra de reescrita depois de corresponder à primeira. Como a segunda regra afeta tudo, ela substitui a primeira. (Outra solução seria escrever seus padrões para que duas URLs não correspondam ao mesmo padrão, por exemplo, alterando o segundo padrão para ^[^/](.*)$
.)