Оба правила не похожи, они идентичны, поэтому всегда будет делать первое.
Если бы я собирался это сделать (а я бы на самом деле этого не сделал, в основном потому, что мне кажется, что эта работа лучше зарезервирована для фабрик по схеме MVC), я бы, вероятно, сказал бы следующее:
RewriteRule ^([^/]*)/news/([^/]*)\.html$ page.php?name=$1&do=news&newstitle=$2 [L]
RewriteRule ^([^/]*)/category/([^/]*)\.html$ page.php?name=$1&do=category&cattitle=$2 [L]
Вам нужен какой-то способ их дифференцировать. Это должно сделать это довольно просто.
Редактировать
Просто чтобы указать, вы могли бы написать это:
RewriteRule ^(.+)/news/(.+)\.html$ page.php?name=$1&do=news&newstitle=$2 [L]
Мое добавленное предпочтение - удалить .html
:
RewriteRule ^(.+)/news/(.+)$ page.php?name=$1&do=news&newstitle=$2 [L]
Мне не нравится выставлять серверные технологии каким-либо образом, и HTML не добавляет ничего, чего мы еще не знаем о сайте.
Лично я использую аналогичную систему:
RewriteRule ^(.*)$ index.php?page=$1 [L,QSA]
URL взломан index.php в такой формат:
http://www.example.com/<controller>/<arg1>/<arg2>
Таким образом, с помощью одного оператора перезаписи я говорю, куда идти, и контроллер возвращает соответствующий вывод. Мне никогда не придется обновлять .htaccess
после этого. Если мне нужен новый функционал, я пишу новый контроллер. Просто на что посмотреть.