
A fast start saw Bournemouth take the lead early through Justin Kluivert from the penalty spot, after a handball from Koni De Winter.
The visitors were reduced to 10 men when goalkeeper Mike Maignan shoved Tyler Adams in the face at a corner, and Marcus Tavernier made it 2-0 from the resulting penalty.
The Cherries were then firmly in control and Amine Adli added the cherry on top with a superb free-kick six minutes from time.
Marco Rose made four changes from the side that beat Sunderland at the weekend.
The biggest surprise was that Milan-born Michele Di Gregorio started in goal in place of Đorđe Petrović, while Bafodé Diakité came in at centre-back and James Hill moved across to right-back.
Ryan Christie. (Image: Richard Crease)
Ben Gannon-Doak started on the wing, as Kluivert made his first start since returning from injury.
It was a fast start from Bournemouth in driving rain at Dean Court.
They had a good chance when Evanilson cut back for Kluivert in the opening minutes, but he could not apply the finishing touch on the edge of the six-yard box.
António Silva then blasted across goal after a corner found Marcus Tavernier, and he crossed for Evanilson who glanced a header wide.
Kluivert stepped up and coolly converted as he sent Maignan the wrong way to give the Cherries the lead in the eighth minute.
Justin Kluivert gave Bournemouth the lead. (Image: Richard Crease)
Ryan Christie fired towards goal from the top of the box but the Milan keeper saved, before the visiting stopper again had to save from an Evanilson effort, this time after the Brazilian had won the ball just outside the box.
James Hill powered towards goal and Maignan palmed it behind after a big deflection, and it was from the resulting corner that the Milan keeper and captain was sent off.
Kluivert took the set piece and Adams hit the deck after a two-handed shove in the face from the keeper.
Mike Maignan was sent off. (Image: Richard Crease)
Referee Fotias showed no hesitation in sending the keeper off, and he was waved down the tunnel by the Cherries faithful when he eventually left the pitch.
It was Tavernier this time who took the spot-kick, and he sent replacement keeper Lorenzo Torriani the wrong way and fired into the bottom-left corner to double the Bournemouth advantage in the 32nd minute.
Tavernier was not far away with a free-kick curled towards the back post, as the Cherries were happy to keep the ball and hold Milan firmly at arm's length heading into the break with a deserved lead.
Marcus Tavernier converted from the spot to double Bournemouth's lead. (Image: Richard Crease)
It was a quieter start to the second half, but Bournemouth controlled the play.
They were passing the ball around nicely and with confidence, as Gannon-Doak had a couple of bright moments when he beat his man and crossed, but without creating a clear-cut chance.
Both goalscorers were replaced just after the hour mark, before Bournemouth were left frustrated as referee Fotias blew for a foul on Evanilson after Gannon-Doak had played Cook through on goal when the loose ball fell to him.
Evanilson took a knock from the challenge, which earned Fikayo Tomori a booking, and the Brazilian was replaced by Álvaro Rodríguez.
The Cherries took the early lead. (Image: Richard Crease)
Bournemouth began to turn the screw and apply the pressure on the Milan box.
Rayan headed over the bar from an excellent Adrien Truffert cross, before Christie sliced a shot across goal when Gannon-Doak cut the ball back to him.
The Scottish winger then saw a shot blocked and Truffert volleyed over from a Cherries corner, before a first half-chance for Milan as De Winter headed towards goal from a free-kick, but Cook headed it behind.
Replacement Alex Tóth was forced off through what looked like a hamstring injury, as Amine Adli came on for him with 13 minutes to play.
It did not take long for the Moroccan to get himself on the scoresheet as he curled in a superb free-kick from 25 yards that was won by the livewire Gannon-Doak with six minutes to play.
Ben Gannon-Doak (Image: Richard Crease)
Rayan went close when he was found by a brilliant Silva pass, but he was denied by a good save from Torriani.
Truffert fired just wide of the top corner from the resulting set piece, as the Cherries saw out a famous win to move to nine points with three wins from three games in the Europa League.
AFC Bournemouth: 20, M. Di Gregorio; 3, A. Truffert; 18, B. Diakité (booked, 16'); 14, António Silva; 5, J. Hill; 12, T. Adams (booked, 29') (Cook 62'); 10, R. Christie; 16, M. Tavernier (Rayan 62'); 19, J. Kluivert (Tóth 62' (Adli 77')); 11, B. Gannon-Doak; 9, Evanilson (Rodríguez 66').
AC Milan: 16, M. Maignan (c) (sent off, 27'); 31, S. Pavlović; 5, K. De Winter (booked, 81'); 23, F. Tomori (booked) (Diawara 66'); 2, P. Estupiñán (booked, 35') (Bartesaghi 46'); 30, A. Jashari; 80, Y. Musah; 20, O. Hutchinson (Torriani 32'); 22, D. Moreira (Comotto 76'); 8, R. Loftus-Cheek (Rabiot 46'); 70, A. Cisse.