Alexander Kerzhakov headed home a dramatic winner in the second minute of stoppage time, triggering wild celebrations in the Petrovsky Stadium.
Alexander Zernov gave Rotor an early lead, but Zenit captain Andrei Kobelev equalized after 21 minutes. Rotor was reduced to 10 men just before the interval when defender Sergei Rashevsky was sent off for a second yellow card.
Zenit piled on constant pressure in the second half but wasted numerous chances before Kerzhakov's strike.
The win gave Zenit 53 points from 28 matches, three points behind leader Spartak, which has a game in hand.
Spartak can clinch its sixth consecutive league title if it beats Zenit in Moscow on Saturday.
Saturn Ramenskoye hammered Alania Vladikavkaz 5-0, with five different goalscorers contributing. The win put Saturn on 47 points, two points behind third-placed Lokomotiv Moscow.
Torpedo Moscow beat lowly Fakel Voronezh 3-1 thanks to a first-half brace by Dmitry Vyazmikin.
On Saturday, Spartak defeated Anzhi Makhachkala to move a step closer to retaining its title.
A Message from The Moscow Times:
Dear readers,
We are facing unprecedented challenges. Russia's Prosecutor General's Office has designated The Moscow Times as an "undesirable" organization, criminalizing our work and putting our staff at risk of prosecution. This follows our earlier unjust labeling as a "foreign agent."
These actions are direct attempts to silence independent journalism in Russia. The authorities claim our work "discredits the decisions of the Russian leadership." We see things differently: we strive to provide accurate, unbiased reporting on Russia.
We, the journalists of The Moscow Times, refuse to be silenced. But to continue our work, we need your help.
Your support, no matter how small, makes a world of difference. If you can, please support us monthly starting from just $2. It's quick to set up, and every contribution makes a significant impact.
By supporting The Moscow Times, you're defending open, independent journalism in the face of repression. Thank you for standing with us.
Remind me later.
