Roman Bednar grabbed the winner as Hearts recorded their eighth straight league win to pull 11 points clear of reigning champions Rangers.
The Czech striker headed home from a Paul Hartley corner to give the SPL leaders an early advantage.
First-half injuries to Bednar, Takis Fyssas and Rangers' Nacho Novo helped create a scrappy game of few chances.
Rangers were denied a penalty late on when a Francis Jeffers shot deflected clear off the arm of Robbie Neilson.
Brazilian Samuel Camazzola had been handed his first start for Hearts, while Rudi Skacel was back in the starting line-up after being rested for the midweek CIS Cup defeat by Livingston.
Dado Prso, who returned to the Rangers side along with Barry Ferguson and Fernando Ricksen after the cup win over Clyde, set up the first chance of the game.
The Croatian striker found Olivier Bernard with a fine cross to the back post, but the full-back could not connect properly with a diving header.
Hearts threatened when Skacel found Edgaras Jankauskas at the front post and Ronald Waterreus could only block the Lithuanian's header.
Ian Murray was forced to concede the corner from which the home side took the lead after just 14 minutes.
Hartley's flashing cross was met by Bednar, who had lost marker Marvin Andrews, to head home from six yards.
Rangers suffered a further blow when Novo had to go off injured, to be replaced with Jeffers.
Skacel gave Bednar the chance of a second goal with a fine cross to the back post, but the striker could only head over from a few yards out.
Hearts were next to suffer an injury blow, scorer Bednar being replaced with Stephen Simmons.
Prso came close to equalising as Hearts adjusted to the change, Craig Gordon diving full stretch to turn the striker's flicked header wide of the post.
Rangers boss Alex McLeish opted to shift to a back four, central defender Rodriguez making way for midfielder Thomas Buffel.
The new formation applied pressure from the start of the second half, but the visitors were short of ideas to breach a sturdy defence.
They felt they should have had a penalty when a Jeffers' half-volley hit Neilson's arm on its way to goal.
But Hearts held on for a win that seriously dents the Glasgow side's chances of retaining the title and equals the club record of eight straight league wins set in 1914-15.
Hearts: Gordon, Neilson, Pressley, Webster, Fyssas (McAllister 32), Jankauskas, Hartley, Camazzola (Wallace 85), Skacel, Bednar (Simmons 27), Brellier.
Subs Not Used: Banks, Cesnauskis, Berra, Elliot.
Booked: Camazzola, Jankauskas.
Goal: Bednar 14.
Rangers: Waterreus, Rodriguez (Buffel 36), Andrews, Kyrgiakos, Ricksen, Namouchi (Nieto 74), Murray, Ferguson, Bernard, Prso, Novo (Jeffers 20).
Subs Not Used: Klos, Lowing, McCormack, Pierre-Fanfan.
Booked: Ricksen, Ferguson.
Ref: K Clark