Ronaldo marks 200th Portugal cap with winner, Haaland fires Norway
Ronaldo struggled for much of the match but repaid coach Roberto Martinez's faith by slotting home from Goncalo Inacio's knock-down in the 89th minute.
Cristiano Ronaldo marked his 200th international appearance with the winner as Portugal beat Iceland 1-0 in Euro 2024 qualifying on Tuesday, while Erling Haaland netted twice for Norway.
Elsewhere, Belgium brushed aside the Thibaut Courtois captaincy row by seeing off Estonia thanks to a Romelu Lukaku double in Tallinn and Moldova came from two goals down to stun Poland.
Portugal appeared to be heading towards a drab goalless draw in Reykjavik until Willum Thor Willumsson was sent off late on.
Ronaldo struggled for much of the match but repaid coach Roberto Martinez's faith by slotting home from Goncalo Inacio's knock-down in the 89th minute.
"It was a nice script (for Ronaldo). There was incredible celebration, the first men's player ever in world football to get 200 international games," Martinez told uefa.com.
The former Real Madrid and Manchester United star's record-extending 123rd international goal was initially ruled out for offside before being awarded by VAR.
"For me it's an unbelievable achievement, it's amazing," said the 38-year-old Ronaldo. "And of course to score the winning goal, it's even more special."
Portugal remain two points clear of Slovakia at the top of Group J after a fourth straight win.
Slovakia, who are Portugal's next opponents in September, won 1-0 away to Liechtenstein to stay unbeaten.
Luxembourg gave their unlikely bid to reach a maiden major tournament a boost with a brilliant 2-0 away victory over Bosnia and Herzegovina to move third, just three points behind Slovakia.
The top two from each group qualify automatically for next year's finals in Germany.
Belgium goalkeeper Courtois had said he was "surprised" that coach Domenico Tedesco told a press conference he had refused to travel to Estonia after being overlooked for the stand-in captaincy last week.
Tedesco had wanted to hand Lukaku the armband for Saturday's 1-1 draw with Austria and give Courtois the honour in Tallinn, with regular captain Kevin De Bruyne absent.
But with Courtois instead back home, Lukaku was named skipper again and responded by scoring two goals in a 3-0 success which helped Belgium stay second in Group F.
Austria remained three points clear in first place, albeit having played a game more than Belgium, as Christoph Baumgartner scored twice in the last 10 minutes to clinch a 2-0 win over Sweden.
The Scandinavians are in danger of failing to reach a Euro tournament for the first time since 1996, sitting four points behind Belgium.
Haaland's brace helped Norway bounce back from their dramatic defeat by Scotland at the weekend with a 3-1 victory against Cyprus.
That kept their slim hopes of reaching a first major tournament since 2000 alive, although they only sit third in Group A and just one point ahead of Spain having played two games more than the three-time champions.
There was chaos in Glasgow, as second-placed Georgia refused to come back from the dressing room for a scheduled restart after their game against Scotland was halted due to heavy rain.
The match was supposed to begin again, with Scotland leading 1-0, at 9:15 pm local time (1915 GMT) but the Georgian players initially failed to come out before the game eventually got back under way 20 minutes later.
Poland fell to fourth place in Group E after blowing a two-goal lead to lose 3-2 to Moldova in Chisinau.
Moldova, who had won only one of their last 43 Euro and World Cup qualifying matches, appeared to have been safely dispatched by first-half goals from Arkadiusz Milik and Robert Lewandowski.
But Ion Nicolaescu's double left Poland reeling and Vladyslav Baboglo, who plays his club football for Ukrainian team Oleksandriya, headed past Wojciech Szczesny to score a dramatic 85th-minute winner.
Moldova, 171st in the FIFA rankings, are now third in the group standings, a point behind second-placed Albania who saw off the Faroe Islands 3-1.
Hungary moved top of Group G by cruising past Lithuania 2-0, level on points with Serbia after their 1-1 draw with Bulgaria.