
Jadon Sancho was hit by a lighter from the crowd as nine-man Borussia Dortmund lost to local rivals Schalke to give their title dreams a major blow.
Dortmund led when Mario Gotze headed in from Sancho’s aerial pass, but the Englishman needed treatment after being hit during the celebrations.
Daniel Caligiuri levelled with a penalty and set up Salif Sane’s header before scoring a second goal.
Axel Witsel briefly gave Dortmund hope before Breel Embolo’s 20-yard clincher.
Dortmund duo Marco Reus and Marius Wolf were both shown straight red cards for dangerous tackles on Suat Serdar.
Bayern Munich now only need to win three of their final four games – starting with Sunday’s trip to Nuremberg (17:00 BST) – to win a seventh consecutive Bundesliga title.
The Ruhr derby had started off so well for Dortmund – who were nine points clear in December and top until 6 April when they lost 5-0 to Bayern.
England winger Sancho, 19, set up his 14th Bundesliga goal of the season when he picked out Gotze with a wonderful ball over the top.
READ: West Ham inflict first loss on Tottenham at new stadium
He was hit in the face by the lighter as they celebrated in front of the home fans but was able to continue.
But their afternoon turned when 15th-placed Schalke got a controversial video assistant referee-awarded penalty for handball, with Caligiuri converting.
The winger then assisted Sane with a corner before scoring a brilliant free-kick from 25 yards following Reus’ red card.
Wolf was then sent off, before Witsel tapped in from close range – but seconds later Embolo hit a sweet 20-yard strike to seal the win.