Luciano Spalletti’s Zenit earned a 1-0 win at San Siro to reach the Europa League, but already-qualified Milan couldn’t make their chances count.
It is only Zenit’s second ever away victory in the Champions League, the other being at BATE Borisov in 2008-09, while Max Allegri’s men end the group phase with just two points from three home games.
The Rossoneri were already qualified, so rotated the squad with Djamel Mesbah, Cristian Zapata, Mathieu Flamini and Giampaolo Pazzini getting rare starts. Philippe Mexes was suspended, joining the injured Kevin Constant, Luca Antonini and Alexandre Pato. Luciano Spalletti’s Zenit missed Vladimir Bystrov and Domenico Criscito, but needed a result to reach the Europa League ahead of Anderlecht.
After just four minutes Milan were denied an evident penalty, as Bruno Alves flattened Pazzini from behind, but the referee waved play on.
Sergei Semak blasted over from distance, while Zapata did well to rush back and rob Hulk on the counter-attack with a clean tackle in the box.
Pazzini’s glancing header on a corner fell to Zapata, who at full stretch couldn’t keep it down. Mattia De Sciglio put in a series of excellent crosses from the right, but the strikers were unable to make the most of them.
Instead, Zenit took the lead with their first chance of the game after 35 minutes. Danny burst into the box and his pull-back wasn’t cleared properly, so he got back on it to steer a low angled drive into the far bottom corner.
Bojan attempted an overhead kick that whistled wide and Vyacheslav Malafeev had his gloves stung by a fierce Flamini snapshot.
In first half stoppages, a free kick whipped across the face of goal, where Pazzini only got a glancing header.
It should’ve been 1-1 after the restart when Kevin-Prince Boateng ran down the right and saw his strike denied by Malafeev’s outstretched foot, then Aleksandr Anyukov made a desperate clearance to stop Urby Emanuelson getting the tap-in.
Pazzini nodded a cross off target and Robinho was introduced for defender Mesbah to give a greater attacking threat. Boateng ballooned over the bar, but Bojan had a great chance when he ran on to a Robinho through ball and was crucially tackled by Tomas Hubocan as he was about to pull the trigger, the loose ball flashing past Pazzini.
Francesco Acerbi almost scored the strangest of goals, as a clearance thumped him in the crotch and ricocheted back into the arms of goalkeeper Malafeev.
Milan were dominating in the second half, but struggling to turn the pressure into goals, so top scorer Stephan El Shaarawy was thrown on for the final 10 minutes. Hulk was also substituted by Zenit and vented his anger at Spalletti, refusing to shake his hand and shouting. The Coach wagged his finger at the fiery striker.
Robinho’s curler was inches wide of the far post, as was El Shaarawy’s daisy-cutter on the turn. Milan gave 17-year-old Andrea Petagna his debut in stoppages and Acerbi had to stop Maksim Kanunnikov going clear on the counter.
There was chaos at the 93rd minute when three Zenit players lined up to finish another counter, but desperate blocks and a Christian Abbiati save on Kanunnikov denied the Russians a second goal.
Milan 0-1 Zenit
Scorers: Danny 35 (Z)
Milan: Abbiati; De Sciglio, Acerbi, Mesbah (Robinho 65), Zapata; Flamini (El Shaarawy 80), Ambrosini, Emanuelson; Boateng, Bojan (Petagna 91); Pazzini
Zenit: Malafeev; Anyukov, Bruno Alves, Lombaerts, Hubocan; Witsel, Denisov, Shirokov (Kanunnikov 88); Semak (Lumb 91), Hulk (Zyryanov 80), Danny
Ref: Chapron (FRA)
Think you know your Italian football? Share your knowledge, tips and comments to win cash prizes in OLBG's World Cup tipster competition  - £10,000 to be won!