A well-worked goal by Theo Hernandez on Rafael Leao assist proved enough for Milan to end their Napoli hoodoo, though there were some late scares at San Siro.
Tijjani Reijnders was suspended, with Fikayo Tomori, Malick Thiaw, Pierre Kalulu, Mattia Caldara, Tommaso Pobega and Samuel Chukwueze out, so Ismael Bennacer and Yacine Adli started together for the first time. Mario Rui sat out a ban with Victor Osimhen at the Africa Cup of Nations and Alex Meret suffering from gastroenteritis, but Walter Mazzarri returned to a three-man defence with a free role for Kvicha Kvaratskhelia, as Piotr Zielinski was fit again too.
Although this was a Champions League quarter-final last season, Napoli were unbeaten here in Serie A since December 2014, winning their last three in a row.
There was a huge early opportunity for the visitors, as Kvaratskhelia rolled across from the right only for Giovanni Simeone to fire off target from close range.
Instead, Milan broke through with a well-worked move that Theo Hernandez started from midfield. He passed it to Olivier Giroud, then Rafael Leao made the slide-rule assist to release the left-back, beating Pierluigi Gollini at the near post.
Rafael Leao tried to add a second with a right-foot curler from distance that Gollini flew to palm away from the far top corner.
Milan were forced into a change when Davide Calabria pulled up with a muscular problem, replaced by Alessandro Florenzi.
Adli was in the right place to intercept the pull-back after Kvaratskhelia twice turned Simon Kjaer to reach the by-line, but Napoli had to change and introduced Matteo Politano for Leo Ostigard, returning to a 4-3-3 in the second half.
Florenzi’s deflected strike almost surprised Gollini, who also had to make sure Giroud didn’t pounce on the loose ball.
Ruben Loftus-Cheek went down in the box under an Amir Rrahmani nudge on the Leao assist, but the referee was there and waved play on.
Bennacer and Leao blasted off target, but Simeone again failed to make the most of a gift of a misplaced Bennacer pass by firing over the bar.
A wonderful Politano left-foot curler skimmed the far post with Mike Maignan scrambling across, then Mattia Gabbia prevented Giacomo Raspadori from meeting the Pasquale Mazzocchi volleyed assist, while Leao bent the finish past the far post.
Loftus-Cheek threw himself in the way of a Politano strike after good work from Matheus Olivera, but Napoli had a huge double opportunity at the 89th minute.
First Jan Simic risked an own goal by deflecting the Jesper Lindstrom effort onto the upright, then Maignan flew to palm the Politano follow-up over the bar.
There were penalty appeals on the following corner, but the ball only hit Yunus Musah’s hand after a double ricochet from point-blank range, while the challenge on Giovanni Di Lorenzo was considered to be fair.
Milan 1-0 Napoli