Lazio remain in third place despite their 2-1 defeat at San Siro, but there was controversy as Patrick Cutrone appeared to score with his arm.
These teams will meet again on Wednesday in the Coppa Italia semi-final, first leg, but both had injury concerns. Capocannoniere Ciro Immobile missed out, so Felipe Caicedo was chosen to lead the attack, while Patrick Cutrone was preferred to Andre Silva to stand in for Nikola Kalinic.
Lazio have only ever won nine Serie A trips to San Siro, along with 23 draws and 43 defeats. Their last victory here in the top flight was 1-0 in September 1989, incredibly decided by a Paolo Maldini own goal, followed by 11 draws and 17 defeats.
Suso blasted wide from distance, but Hakan Calhanoglu’s scorcher was on target and stung Thomas Strakosha’s gloves.
Milan’s bright start paid off, as Calhanoglu whipped in a fierce free kick and Cutrone shook off his marker to nod in from close range. Replays from the angle behind the goal suggest Cutrone turned that in with his arm, but this might not have been the angle visible for the VAR officials and will cause yet more controversy.
However, Adam Marusic got Lazio back on level terms within five minutes, as he got away from Luca Antonelli and cut inside for a left-foot curler into the far bottom corner.
Suso’s free kick was just wide of the near top corner, but Luis Alberto went even closer, his stunning strike bouncing off the crossbar with Gigio Donnarumma beaten.
Another ferocious Calhanoglu solo effort was beaten away by Strakosha, but Milan restored their advantage with a splendid Davide Calabria cross on to the head of Jack Bonaventura.
Both Sergej Milinkovic-Savic and Senad Lulic were booked, so will be suspended next week against Genoa. Lazio had a good chance to equalise when substitute Felipe Anderson turned two defenders inside out and pulled back for Milinkovic-Savic, but Alessio Romagnoli charged down the shot just in front of Donnarumma.
The goalkeeper was called upon to deny a Milinkovic-Savic header and substitute Andre Silva couldn’t reach a Suso cross.
Lazio should’ve equalised on 85 minutes when Felipe Anderson pulled back from the by-line, but Senad Lulic got there with his knee and deflected it away from goal.
Although it was Lazio who played an extra game on Wednesday, Milan seemed exhausted as the game wore on and were increasingly pinned back. Marco Parolo volleyed wide from close range in stoppages, as the Rossoneri held on for a third straight win.
See the latest Serie A predictions and betting tips with Eurotips.co.uk