Roma started the brighter of the two sides, but it was Milan who went in front against the run of play, when Yacine Adli opened his account for the season with a neat finish inside 11 minutes, as he sat his defender down before striking left-footed into the opposite corner.
And they were the width of the crossbar from doubling their lead on the half-hour mark, as Theo Hernandez’s cross-come-shot almost embarrassed Mile Svilar on his first league start of the season.
The visitors still stayed true to their attacking play though, and Zeki Celik’s strike was wonderfully tipped away by Mike Maignan just moments later.
The Frenchman also had to save smartly from Leandro Spinazzola five minutes before the break, as Roma counted themselves a little unlucky to be behind at the break.
Milan perked up their ideas in the second half, and should have doubled their advantage when Matteo Gabbia got his header horribly wrong after being picked out by Hernandez from a free-kick.
Luckily, his blushes were spared when a much more reliable goalscorer in Olivier Giroud headed home his 10th Serie A goal this season, after being teed up by Simon Kjaer. As a result, he has now reached double figures in three consecutive league campaigns, and is the first Milan player to do so since Alexandre Pato.
Roma came back from 2-0 to draw 2-2 in this fixture last season, and the Rossoneri might have been feeling a case of déjà vu when the visitors were awarded a penalty, which was converted down the middle by Leandro Paredes for his first goal of the campaign.
However, any hopes of the Giallorossi equalising this time were wiped out when Hernandez produced a thunderbolt to restore Milan’s two-goal lead, striking in off the crossbar after Giroud’s delicate set-up.
Substitute Yunus Musah almost added some extra gloss on the scoreline in stoppage time, but his toe-poke rebounded off the post.
The result inflicted Roma’s third consecutive away league defeat, the first time this has happened since 2021, and leaves them off the pace for European places in ninth.
Flashscore Man of the Match: Olivier Giroud (AC Milan)