Blackburn took a huge step towards Championship safety as Jordan Rhodes' late penalty defeated Millwall.
Karleigh Osborne gave the hosts the lead with a shot on the turn.
David Jones equalised straight from a corner before Rhodes hit the winner after Grant Hanley had been tripped by Lions skipper Danny Shittu, who was sent off at full-time for protesting.
Rovers move five points clear of the relegation zone, one ahead of Millwall, with both teams one win from survival.
Millwall's remaining games
27 April: h v Nottm Forest
30 April: h v Crystal Palace
04 May : a v Derby
Blackburn will be safe if they overcome Crystal Palace at Ewood Park on Saturday.
Thanks to their run to the FA Cup semi-finals, Millwall still have three games to play, but have lost three of the last four.
Lions boss Kenny Jackett saw his side take the lead when former Brentford player Osborne fired home from seven yards, his first goal for the club.
Rovers barely threatened until the closing stages of the first-half, Jones forcing goalkeeper David Forde into a fingertip save from 25 yards.
But the on-loan Wigan midfielder did find the net in the 56th minute straight from a corner which squirmed past Rob Hulse and into the net.
Forde made another good save from David Dunn, but was the keeper was furious when the referee pointed to the spot in the 78th minute.
Blackburn's remaining games
27 April: h v Crystal Palace
04 May: a v Birmingham
Both he and Shittu were booked for their protests after Hanley went crashing to the ground following a powerful run.
Although Rhodes sent Forde the wrong way, Millwall missed a great chance to equalise when Osborne was denied a second goal by goalkeeper Grzegorz Sandomierski.
The final whistle saw Shittu continue his protests and the player was shown the red card by referee Gavin Ward.
Millwall manager Kenny Jackett on the penalty decision:
"That decision has cost us.
"I've just seen it again and it looked like a soft decision, in my opinion the referee got it wrong, it didn't look like there was any contact.
"I was looking for the refereeing team to make the right call as it looked soft at the time, and having seen it again it was."
Shittu's protests at the final whistle earned him a red card and Jackett added: "Danny's very upset, but I have to back my player.
"He's a passionate man and he felt very passionately that there was no contact. Unfortunately it was a second yellow which we cannot appeal."
Blackburn caretaker boss Gary Bowyer:
"I thought it was a great run from Hanley, he deserves credit for that, and from where I stood I jumped up because I thought it was a penalty.
"I don't think we should be talking about that, we should be talking about our second-half performance and how brave my players were. Some you get, some you don't.
"Are we safe? No. It's crazy with 56 points but, no, we aren't."
- 01 Forde Booked
- 02 Dunne
- 03 Shittu Booked
- 16 Beevers
- 21 Smith
- 27 Osborne
- 14 Henry
- 15 Feeney (Keogh - 77' )
- 26 Abdou Booked
- 07 Hulse (Wright - 61' )
- 31 Easter (Batt - 62' Booked )
- 33 M Taylor
- 28 Malone
- 04 Wright
- 18 Woolford
- 29 Saville
- 11 Batt
- 20 Keogh
- 29 Sandomierski
- 16 Dann
- 19 Kane
- 31 G Hanley Booked
- 08 Dunn Booked (Orr - 90' )
- 14 Ms Olsson (King - 46' )
- 17 Williamson
- 24 Morris
- 36 Jones
- 11 Rhodes
- 39 Kazim-Richards (Goodwillie - 15' )
- 30 Usai
- 02 Orr
- 12 Pedersen
- 13 Murphy
- 15 King
- 21 Nuno Gomes
- 25 Goodwillie
Live Text Commentary
Full Time The game is over, as the referee blows his whistle.90:00 +7:01
Short corner taken by David Goodwillie from the right by-line.90:00 +6:12
Free kick awarded for a foul by Danny Shittu on Grant Hanley. Free kick taken by Grzegorz Sandomierski.90:00 +5:42
Jordan Rhodes gives away a free kick for an unfair challenge on Mark Beevers. David Forde takes the free kick.90:00 +4:33
Inswinging corner taken from the left by-line by James Henry, save made by Grzegorz Sandomierski. Karleigh Osborne takes a shot. Grzegorz Sandomierski makes a comfortable save. Corner taken right-footed by Josh Wright.90:00 +3:36
Josh Morris concedes a free kick for a foul on Andy Keogh. Josh Wright crosses the ball from the free kick right-footed from left channel, Scott Dann manages to make a clearance.90:00 +2:20 Substitution
Substitution David Dunn goes off and Bradley Orr comes on.90:00 +0:49
The assistant referee signals for offside against Shaun Batt. Grzegorz Sandomierski takes the free kick.89:30
Free kick awarded for a foul by Shaun Batt on Grant Hanley. Free kick taken by Grzegorz Sandomierski.88:42
Jack Smith gives away a free kick for an unfair challenge on Joshua King. Free kick taken by Grzegorz Sandomierski.88:14
Free kick awarded for an unfair challenge on Danny Shittu by David Dunn. Free kick taken by David Forde.87:42 Booking
Booking The referee cautions Nadjim Abdou for unsporting behaviour.87:34
Nadjim Abdou handles the ball and concedes a free kick. Grzegorz Sandomierski takes the free kick.86:18
Inswinging corner taken from the right by-line by David Jones, Jordan Rhodes gives away a free kick for an unfair challenge on David Forde. Free kick taken by David Forde.85:08
Foul by Nadjim Abdou on Scott Dann, free kick awarded. Grzegorz Sandomierski takes the direct free kick.81:01
Unfair challenge on Shaun Batt by Grant Hanley results in a free kick. Free kick crossed by James Henry, free kick awarded for a foul by Shaun Batt on David Goodwillie. Direct free kick taken by Grzegorz Sandomierski.78:45
Unfair challenge on Danny Shittu by Joshua King results in a free kick. Direct free kick taken by David Forde.77:08 Goal scored
Goal! - Jordan Rhodes - Millwall 1 - 2 Blackburn Penalty scored by Jordan Rhodes. Millwall 1-2 Blackburn.75:57 Substitution
Substitution Andy Keogh on for Liam Feeney.75:57 Booking
Booking Danny Shittu shown a yellow card.
Booking David Dunn is shown a yellow card for dissent.75:18 Booking
Booking David Forde is cautioned.74:18
Danny Shittu concedes a Penalty for a foul on Grant Hanley.71:34
Free kick awarded for a foul by Shaun Batt on Grant Hanley. Scott Dann takes the direct free kick.70:32
Foul by Shaun Batt on Scott Dann, free kick awarded. Free kick taken by Grant Hanley.65:18
Shaun Batt fouled by Grant Hanley, the ref awards a free kick. James Henry restarts play with the free kick.64:14 Booking
Booking Shaun Batt goes into the book.64:05
Grant Hanley fouled by Shaun Batt, the ref awards a free kick. Grzegorz Sandomierski takes the direct free kick.61:00 Substitution
Substitution Shaun Batt on for Jermaine Easter.61:00 Substitution
Substitution Josh Wright replaces Rob Hulse.58:55
David Dunn takes a shot. Unfair challenge on Mark Beevers by David Goodwillie results in a free kick. David Forde takes the free kick. Save by David Forde.57:07
Foul by Rob Hulse on Grant Hanley, free kick awarded. Grzegorz Sandomierski takes the direct free kick.55:19 Goal scored
Goal! - David Jones - Millwall 1 - 1 Blackburn David Jones finds the net. Millwall 1-1 Blackburn.55:05
Inswinging corner taken by David Jones,49:00
David Jones takes a shot. Save by David Forde. David Jones decides to take a short corner.45:03 Substitution
Substitution Joshua King comes on in place of Markus Olsson.45:01
The match restarts for the second half.45:00 +2:24 Half time
Half Time The referee blows for half time.45:00 +1:20
David Jones takes a shot. David Forde makes a comfortable save. Inswinging corner taken left-footed by David Jones, David Forde makes a save.45:00 +0:44
Free kick awarded for a foul by Jermaine Easter on Paulo Jorge. Free kick taken by Jordan Rhodes.43:19
Free kick awarded for an unfair challenge on Paulo Jorge by Liam Feeney. Free kick taken by Lee Williamson.42:29
Rob Hulse is ruled offside. Grant Hanley takes the direct free kick.38:35
Free kick awarded for an unfair challenge on James Henry by Todd Kane. Free kick crossed right-footed by James Henry, Grzegorz Sandomierski makes a save.36:32
David Dunn produces a right-footed shot from just outside the box that misses to the right of the net.27:57
Free kick awarded for a foul by Jordan Rhodes on Karleigh Osborne. Free kick taken by David Forde.27:24
The offside flag is raised against Jermaine Easter. Grant Hanley takes the direct free kick.26:00
Outswinging corner taken right-footed by James Henry from the right by-line, Headed effort from inside the area by Rob Hulse misses to the left of the target.23:54
Outswinging corner taken by James Henry from the right by-line, Paulo Jorge makes a clearance.22:15
Foul by Danny Shittu on David Goodwillie, free kick awarded. Free kick crossed right-footed by David Dunn from own half.19:27
Liam Feeney takes a shot. Grzegorz Sandomierski makes a save.18:41
Inswinging corner taken left-footed by David Jones played to the near post, Rob Hulse makes a clearance.17:01
Outswinging corner taken by James Henry from the right by-line, save by Grzegorz Sandomierski.16:32
Outswinging corner taken by James Henry from the right by-line, clearance by Paulo Jorge.15:46
Foul by David Dunn on Jermaine Easter, free kick awarded. Free kick crossed by James Henry, Grzegorz Sandomierski makes a comfortable save.14:49 Substitution
Substitution Colin Kazim-Richards goes off and David Goodwillie comes on.13:29
The assist for the goal came from Mark Beevers.13:29 Goal scored
Goal! - Karleigh Osborne - Millwall 1 - 0 Blackburn Karleigh Osborne scores a goal from inside the area to the bottom left corner of the goal. Millwall 1-0 Blackburn.12:34
James Henry delivers the ball,12:34 Booking
Booking Grant Hanley booked for unsporting behaviour.11:51
Foul by Grant Hanley on Liam Feeney, free kick awarded.10:28
Outswinging corner taken from the right by-line by James Henry, clearance by Paulo Jorge.7:31
Free kick awarded for an unfair challenge on Grant Hanley by Rob Hulse. Free kick taken by Grzegorz Sandomierski.5:47
Free kick awarded for an unfair challenge on Alan Dunne by Josh Morris. David Forde restarts play with the free kick.3:24
Unfair challenge on Liam Feeney by David Dunn results in a free kick. Alan Dunne restarts play with the free kick.3:00
Corner taken right-footed by James Henry from the left by-line, clearance by Paulo Jorge.1:29
Unfair challenge on Jermaine Easter by David Dunn results in a free kick. Alan Dunne takes the free kick.0:43
Nadjim Abdou challenges David Dunn unfairly and gives away a free kick. David Dunn takes the free kick.0:00
The referee gets the game started.
Live data and text provided by our data suppliers