Marco Reus netted twice before the break after Weidenfeller saved a Di Maria penalty but the German side couldn't find a third goal to go beyond Carlo Ancelotti's club
With a 3-0 first-leg advantage, Madrid was rocking at halftime as Marco Reus' double reduced the aggregate score to 3-2 in a fervent atmosphere at Signal Iduna Park on Wednesday.
Both goals came after Angel Di Maria had seen a penalty saved by Roman Weidenfeller, the Argentinian losing his footing on the wet surface as he went to strike the ball.
Two efforts from Reus - capitalizing on mistakes from the visitors each time - gave Jurgen Klopp's side hope of a memorable fightback but they could not force the third goal that would have sent the tie into extra-time as Real gained a measure of revenge for last year's semifinal loss to Dortmund.
Carlo Ancelotti left Cristiano Ronaldo, struggling with a minor knee injury, on the bench for the duration of the game and Madrid just about managed in his absence, holding off a determined Dortmund in the final stages to book their place in the last four.
The visitors wasted a golden opportunity to practically wrap up the tie in the 17th minute, Weidenfeller diving to his left to keep out Di Maria's spot kick after Lukasz Piszczek was adjudged to have handled Fabio Coentrao's cross.
Dortmund ought to have got itself the early goal its fans craved two minutes later, Henrikh Mkhitaryan side-footing wide from 10 yards after being teed up by Reus.
Reus rendered that miss irrelevant in the 24th minute, taking advantage of Pepe's weak back-header to round Iker Casillas and slot the ball into the net.
Dortmund was rampant, with Casillas tipping Mats Hummels' header over the bar from Reus' curling free kick, before the Germany playmaker doubled his tally in the 37th minute as once again Madrid contributed to its own downfall.
Asier Illarramendi surrendered possession, allowing Reus to feed Robert Lewandowski, and as his shot was tipped onto the post by Casillas, Reus was on hand to smash in the rebound.
Real made a bright start to the second half, with Gareth Bale testing Weidenfeller with a stinging effort in the 49th minute, before a last-ditch challenge from Hummels denied Karim Benzema as the Frenchman prepared to shoot into an empty net on the hour mark.
Despite its improved showing, Madrid was lucky to stay ahead in the tie in the 65th minute when Mkhitaryan struck the outside of the post after rounding Casillas following more excellent work by Reus.
The Armenian again went close three minutes later, this time seeing his strike saved by the Spanish goalkeeper as Dortmund continued to press, Casillas also denying Kevin Grosskreutz in the 71st minute.
Despite a frantic finale, Dortmund was unable to carve out one more clear opportunity as the final whistle allowed Madrid to breathe a huge sigh of relief.