Rangers enjoyed one of their finest ever nights in European football as they took a 4-2 lead against Borussia Dortmund in their Europa League tie courtesy of some exquisite attacking play and woeful defending from their hosts.
Dortmund squandered good chances to take the lead, firstly with Dan-Axel Zagadou heading straight at Allan McGregor when unmarked from a corner before a Jude Bellingham shot across the six-yard box needed only a slight touch for the opener.
Borna Barisic had Rangers' best chance early on, forcing Gregor Kobel into a decent save having dallied on the ball for too long, though the Croatian also had a frantic moment at the back when he fluffed a clearance from Marco Reus' back-heel, though he eventually cleared his lines.
Dortmund's inefficiency came back to bite them as Rangers took their chances towards the end of the half. Zagadou was again the villain, inexplicably raising his hands at a corner to give away a penalty courtesy of a VAR intervention which James Tavernier calmly converted.
Some more calamitous defending allowed Joe Aribo to glance a header across goal, gifting Alfredo Morelos the easiest tap-in going to give the visiting Scottish champions a shock 2-0 lead.
Dortmund made changes at half time, introducing Giovanni Reyna and Youssoufa Moukoko, but that didn't stop Rangers making an excellent start to the second half as John Lundstram swept in from the edge of the box for 3-0.
The hosts finally showed some bite in attack two minutes later, with England youngster Jude Bellingham converting with excellent precision from outside the area to give BVB some semblance of hope.
Semblance of hope, you say? Well, if you defend in a manner Roy Keane would be flabbergasted at, you've got no chance, and that's what happened as Rangers made it 4-1.
Giovanni van Bronckhorst's side broke with pace before Morelos' shot deflected slightly off Zagadou and into the back of the net. The assistant referee had originally ruled it out for offside, but there was no such infringement and after a lengthy delay the goal was given.
While it was a shoddy performance on the whole from Dortmund, they did give themselves hope of a turnaround in the return leg when Raphael Guerreiro sent a howitzer past McGregor.
That return leg takes place on Thursday next week, when Dortmund will hope to have striker Erling Haaland fit to play as they look to overturn the two-goal deficit.
Borussia Dortmund player ratings
1. Goalkeeper & defenders
Gregor Kobel (GK) - 5/10 - Stayed big to deny Barisic with a good save. Not helped by those in front of him who decided to take the day off.
Manuel Akanji (RB) - 4/10 - Ruined a fair amount by Kent's terrific dribbling. Hooked in the 55th minute.
Mats Hummels (CB) - 2/10 - Done at the top level. So slow, can't spot danger.
Dan-Axel Zagadou (CB) - N/A - Wasted a free header, miscuing it straight to McGregor. Awful lapse of concentration gave Rangers a penalty which Tavernier converted. Scored an own goal to effectively put Dortmund out of the tie. We don't hand out N/A ratings too often at 90min, but good lord Zagadou was awful.
Raphael Guerreiro (LB) - 8/10 - Got the assist for Bellingham's strike with a deft lay-off. Brought Dortmund back into the tie with the game's best goal, swerving a long-range effort up and over McGregor.
Axel Witsel (CM) - 6/10 - Didn't misplace a pass during the first half and was reasonably solid before his withdrawal as Dortmund chased goals.
Mahmoud Dahoud (CM) - 4/10 - Sieve-like in midfield, too often being dribbled past. Good run in the build-up to Guerreiro's strike but wasn't good enough.
Marco Reus (AM) - 5/10 - A few moments of creativity nearly saw Dortmund go ahead while the score was 0-0.
Julian Brandt (RW) - 5/10 - Had a couple of flirty dribbles but there was little substance to anything the Germany international did.
Donyell Malen (ST) - 5/10 - Had a couple of shots, both of which were blocked, before coming off in the 68th minute.
Jude Bellingham (LW) - 8/10 - Can't be blamed for Dortmund's woes. Got them back into the tie with two goal contributions, curling in from the edge of the box before teeing up Guerreiro's terrific strike.
Giovanni Reyna (LW) - 6/10
Youssoufa Moukoko (RW) - 5/10
Nico Schulz (LB) - 6/10
Steffen Tigges (ST) - 5/10
Reinier (CM) - N/A
Rangers player ratings
5. Goalkeeper & defenders
Allan McGregor (GK) - 6/10 - Barely worked at all during his 100th European appearance for Rangers. A great way to celebrate that landmark. Did get booked for time wasting, though.
James Tavernier (RB) - 8/10 - Kept his cool from the spot for the opener and his awesome corner led to Morelos making it 2-0. Solid in defence.
Conor Goldson (CB) - 6/10 - Won his aerial duels at the back and made a nuisance of himself in the opposition box.
Calvin Bassey (CB) - 6/10 - Showed good pace to recover when Malen got in behind on a few occasions early on.
Borna Barisic (LB) - 6/10 - Got in on goal but took too long before shooting straight at Kobel. Lost possession a few times but largely good at the back.
Ryan Jack (CM) - 7/10 - Probably one of the quieter performers for Rangers on the night, but that's hardly a criticism. Kept things solid and snapped into plenty of tackles.
John Lundstram (CM) - 8/10 - Joined the attacks and got his reward in the second half. Accurate with the ball at his feet, rarely misplacing a pass.
Joe Aribo (AM) - 9/10 - Excellent flick at the front post gave Morelos an easy goal on the line. Also played a large role in the Zagadou own goal. Ran forward with great purpose and was great all night.
Scott Arfield (RW) - 6/10 - A workhouse on the right, bolstering Rangers' defence. Not the most cutting attacking display but he was the extra man who stretched Dortmund's defence during a number of counter-attacks.
Alfredo Morelos (ST) - 9/10 - Got the easiest goal of his life when he arrived on the scene to tap in Aribo's header. Played a role in the Zagadou own goal, too.
Ryan Kent (LW) - 9/10 - Teed up Lundstram for Rangers' third with an awesome run, jinking through Dortmund's defence. Very good in defence too, making four (?) tackles.
James Sands (CB) - 6/10
Aaron Ramsey (RF) - N/A
Glen Kamara (CM) - N/A
Scott Wright (AM) - N/A