Filip Helander's thumping header settled a pulsating Old Firm derby as a depleted Rangers inflicted Celtic's second Scottish Premiership defeat of the season at a packed Ibrox.
The home side, with manager Steven Gerrard and several players absent after a Covid outbreak, made it seven derbies in a row without defeat, with victory in six of them.
Celtic striker Odsonne Edouard somehow squirted wide from close range with the game goalless, before Helander's header claimed the points for the champions.
The victory moves Rangers to within a point of Hibernian and Hearts at the summit, with Celtic in sixth place after two defeats in four matches.
It also means Ange Postecoglou becomes the first Celtic manager since Tony Mowbray in 2009 to lose his first Old Firm derby.
It was the first Old Firm game in front of fans since December 2019, but Celtic had to face down the capacity Ibrox crowd without any of their own people to support them.
But there were absentees in the Rangers ranks, too. Most notable was manager Gerrard, who was not at Ibrox after a Covid outbreak, and was replaced by assistant Gary McAllister.
Goalkeepers Allan McGregor and Jon McLaughlin, captain James Tavernier, and fellow right-back Nathan Paterson, were among the others missing, with McAllister revealing afterwards he was unsure who would be available until Sunday morning.
The uncertainty and vulnerability both sides had shown this season made it all the more fascinating. The question was who would blink first?
Rangers striker Alfredo Morelos shot over early on as he tried to hit the net for the third derby in a row, and Celtic's Japanese forward Kyogo Furuhashi clipped an effort wide in his first taste of this occasion.
Back it swung again. Rangers' Kemar Roofe chested the ball down in the box but couldn't get a shot away, before Edouard inexplicably passed up a golden chance.
Kyogo squared the ball into the Frenchman's path with just third-choice goalkeeper Robbie McCrorie to beat. The Edouard of old would have put it away in his sleep, but this time he horribly skewed in the wrong direction.
Rangers' Kent whipped a low shot off the outside of the far post as the end-to-end action continued. But in all the frantic and absorbing action, neither goalkeeper had actually been tested in 45 minutes.
The tide appeared to turn in Rangers' favour after the break, though. Connor Goldson, Kent and Roofe all had half-chances before Celtic responded with a tame David Turnbull free-kick into the hands of McCrorie.
And, with the momentum very much with Rangers, they broke the deadlock when Borna Barisic's corner reached Helander, who made a late run to the back post and bulleted a header beyond Joe Hart.
The game still had more twists and turns in it, though. Moments after conceding, Kyogo found himself one-on-one with McCrorie, but the young Rangers goalkeeper denied him with a smart save in what was only his second appearance.
And the Japanese again broke through into the box, but elected for a strike instead of squaring the ball to an unmarked Ryan Christie, with McCrorie getting a foot to the shot.
A minute later he made he made the wrong decision again - squaring when he should have shot - before Celtic debutant Josip Juranovic shot over as Celtic applied late pressure.
Fashion Sakala might have burnished Rangers' lead when he broke free on the right, but the hosts had done enough to maintain their dominance in Glasgow, and have now won their last 21 home league games in a row.
Man of the match - Leon Balogun
Balogun (left) had to fill in at right back but kept the dangerous Kyogo quietWhat did we learn?
Both had to deploy makeshift defences; Rangers playing Leon Balogun at right back, while Croatian defender Juranovic made his Celtic debut in an unfamiliar left-back role. Despite that, both defences stood up well.
The game turned on a fantastic delivery from a Barisic corner, but Celtic will be left licking their wounds having passed up glorious chances of their own.
What's next?
After the international break, Rangers travel to St Johnstone on Saturday, 11 September (12:30 BST) while Celtic are at home to Ross County later that day (15:00).
helpHow to play
Rate players out of 10 throughout or after the game. The rater will close 30 minutes after the final whistle.
Rating range key1 = Give it up10 = Pure perfection
Rangers
Squad number28Player nameMcCrorie
Squad number26Player nameBalogun
Squad number6Player nameGoldson
Squad number5Player nameHelander
Squad number31Player nameBarisic
Squad number17Player nameAribo
Squad number10Player nameDavis
Squad number18Player nameKamara
Squad number25Player nameRoofe
Squad number20Player nameMorelos
Squad number14Player nameKent
Squad number4Player nameLundstram
Squad number30Player nameSakala
Squad number37Player nameArfield
Celtic
Squad number15Player nameHart
Squad number56Player nameRalston
Squad number57Player nameWelsh
Squad number4Player nameStarfelt
Squad number88Player nameJuranovic
Squad number17Player nameChristie
Squad number42Player nameMcGregor
Squad number14Player nameTurnbull
Squad number11Player nameAbada
Squad number22Player nameEdouard
Squad number8Player nameFuruhashi
Squad number12Player nameSoro
Squad number18Player nameRogic
Squad number54Player nameMontgomery
Line-ups
Rangers
Formation 4-3-3
28McCrorie
26Balogun6Goldson5Helander31Barisic
17Aribo10Davis18Kamara
25Roofe20Morelos14Kent
28McCrorie26Balogun6Goldson5Helander31Barisic17Aribo10Davis18Kamara25RoofeSubstituted forLundstramat 74'minutes20MorelosSubstituted forSakalaat 84'minutes14KentSubstituted forArfieldat 89'minutesSubstitutes
4Lundstram7Hagi11Itten22Bacuna30Sakala37Arfield54WrightCeltic
Formation 4-3-3
15Hart
56Ralston57Welsh4Starfelt88Juranovic
17Christie42McGregor14Turnbull
11Abada22Edouard8Furuhashi
15Hart56Ralston57Welsh4Starfelt88Juranovic17Christie42McGregor14TurnbullBooked at 38minsSubstituted forRogicat 67'minutes11AbadaSubstituted forMontgomeryat 86'minutes22EdouardBooked at 65minsSubstituted forSoroat 68'minutes8FuruhashiSubstitutes
6Bitton10Ajeti12Soro18Rogic26Urhoghide29Bain54MontgomeryLive Text
Match ends, Rangers 1, Celtic 0.
Second Half ends, Rangers 1, Celtic 0.
Attempt blocked. Stephen Welsh (Celtic) header from the centre of the box is blocked. Assisted by Ryan Christie with a cross.
Corner, Celtic. Conceded by Borna Barisic.
Foul by Ismaila Soro (Celtic).
Glen Kamara (Rangers) wins a free kick in the attacking half.
Attempt saved. Fashion Sakala (Rangers) right footed shot from the right side of the box is saved in the bottom right corner. Assisted by Steven Davis.
Hand ball by Scott Arfield (Rangers).
Substitution, Rangers. Scott Arfield replaces Ryan Kent.
Attempt missed. Josip Juranovic (Celtic) right footed shot from outside the box is too high. Assisted by Adam Montgomery.
Carl Starfelt (Celtic) wins a free kick in the attacking half.
Foul by Fashion Sakala (Rangers).
Substitution, Celtic. Adam Montgomery replaces Liel Abada.
Attempt saved. Kyogo Furuhashi (Celtic) right footed shot from the right side of the box is saved in the bottom right corner. Assisted by Tomas Rogic.
Substitution, Rangers. Fashion Sakala replaces Alfredo Morelos.
Foul by Carl Starfelt (Celtic).
Alfredo Morelos (Rangers) wins a free kick in the defensive half.
Attempt missed. Alfredo Morelos (Rangers) right footed shot from a difficult angle on the right is close, but misses to the right. Assisted by Joe Aribo.
Foul by Ryan Christie (Celtic).
John Lundstram (Rangers) wins a free kick in the defensive half.