There was drama in Glasgow as Rangers were taken to extra time by Braga before winning 3-1 on the night and 3-2 on aggregate as the Portuguese side finished the game with nine men.
James Tavernier gave Rangers a second-minute lead to level the tie on aggregate, and they had another goal disallowed and then hit the woodwork before winning a penalty just before the interval.
Vitor Tormena was sent off for a foul on Kemar Roofe, and Tavernier netted from the spot.
David Carmo's 83rd-minute header took the tie to extra time, but Roofe's 101st-minute finish put Rangers back in front on aggregate and Braga then had Iuri Medeiros dismissed.
Rangers will now face Leipzig in their first European semi-final since reaching the 2008 UEFA Cup final.