The table-topping clash marked the start of the final third of the season and it was Hulk who proved the hero, scoring twice to ensure a win that sets Zenit on course for a first domestic title since 2012.
The holders trail by eight points going into the final nine games after Hulk scored twice in 11 minutes.
Carlos Strandberg pulled one back for the defending champions but CSKA's six-match winning run in the top flight was ended.
"We cannot relax. Everything is very open and I don't believe that CSKA has stopped dreaming about the championship," Villas-Boas told reporters.
"If we rotate we do that for injuries or because of suspension, we do that to keep everyone on top. It's possible that we will make changes but my view is to make sure we win the league and do everything that we can for that."
CSKA's defeat allowed Krasnodar to move within two points of them, with Pavel Mamaev's brace helping them to a 4-0 win over Mordovia Saransk.
Ricardo Laborde and Vladimir Bystrov were also on target in the comfortable win while fellow European hopefuls Rubin Kazan made it five consecutive league wins as they saw off Amkar Perm 3-0.
Dinamo and Lokomotiv shared the spoils in their Moscow derby at the Arena Khimki - Manuel Fernandes' late penalty ensuring a 2-2 draw in the capital.
Spartak Moscow and Kuban Krasnodar drew 1-1 while Rostov gave their survival hopes a shot in the arm with a 1-0 win over fellow strugglers Ural.
The sides are now level on points thanks to Artem Dzyuba's late winner, but both are in the bottom four after Torpedo Moscow beat Arsenal Tula 3-1 to vault out of the drop zone.
Marcin Komorowski's 67th-minute goal had ensured Terek Grozny a 1-0 win over over Ufa in Sunday's penultimate game.
Get the best features, fun and footballing frolics straight to your inbox every week.
Thank you for signing up to Four Four Two. You will receive a verification email shortly.
There was a problem. Please refresh the page and try again.