After a 0-0 draw where Gabriel Jesus was denied a winning goal by VAR, Porto joined Manchester City in the Champions League knockout stages.
The side of Pep Guardiola have already been through to the last-16 and will now advance as group winners, while they will be disappointed to have lost their 100 percent record in the competition this season having dominated at Estadio do Dragao for long periods.
When Agustin Marchesin tipped his 80-minute header into the crossbar, Jesus scored on the rebound, while replays revealed that before delivering his cross to the Brazil striker, Joao Cancelo was fractionally offside.
The victory of Marseille over Olympiacos made this match an academic one with three points each for the other two teams in Group C.
For most of the opening exchanges, City penned Porto into its own half, while each side had penalty claims ignored by referee Bjorn Kuipers – first when Malang Sarr slid in on Raheem Sterling before Ederson met fellow Brazilian Otavio robustly in his region.
Ederson palmed out of his goalmouth Diogo Leite’s 22nd-minute header, sparking a fast break where Ferran Torres was thwarted by opposite number Agustin Marchesin.
When Sterling scampered in behind the Porto defense, with the England winger’s shot from the resulting corner cleared off the line by Zaidu Sanusi, Sarr made a crucial clearance over his own crossbar.
Sterling was found by Phil Foden’s sumptuous 58th-minute through-ball, but Marchesin was equal to the challenge and when the rebound dropped his way, Torres’ footing abandoned him.
A sprawling Ruben Dias unintentionally hooked a Sterling attempt out of the Porto goalmouth in a dramatic 70th-minute series, with Marchesin equal to Torres’s overhead kick follow-up.
The home goalkeeper made another brilliant save from Eric Garcia, Dias’ center-back partner, winning his VAR reprieve by the time Jesus inevitably beat him.