Briton Adam Yates retained the overall leader's yellow jersey.
Belgian Jasper Philipsen took second place with France's Christophe Laporte finishing third, eight seconds behind.Overall, Van Aert leads compatriot Yves Lampaert (Quick Step Alpha Vinyl) by 25 seconds and defending champion Tadej Pogacar (UAE Emirates) by 32.
'It's a big emotion because I've won on the Tour. I haven't won (a race) since the start of the season. It's great to make it. It was tough but I'm super happy to have won.'
Briton Adam Yates retained the overall leader's yellow jersey after staying tucked in the main peloton, which crossed the line with a deficit of 2:53.
Frenchman Alaphilippe retains lead.
Stage eight winner Nans Peters had long crossed the line when fellow Frenchman Thibaut Pinot's ordeal ended after the Groupama-FDJ rider, highly fancied to become the first local winner of the race in 35 years, had been dropped in the second ascent of the 141-km trek through the Pyrenees.
Chris Froome showed again he will attack his rivals on every terrain as the Briton extended his overall lead in the Tour de France with a surprising move in Wednesday's 11th stage, which was won with panache by world champion Peter Sagan.
The Slovenian played it safe on the last climb of the day but it was enough for him to move to the top of the standings in a ninth stage won by Tour debutant Pogacar.
The 22-year-old Bernal, the youngest rider to win the race in 110 years, gave Team Ineos --formerly Team Sky -- their seventh title in the last eight editions.
World champion Peter Sagan claimed his third 2016 Tour de France stage victory when he pipped Alexander Kristoff on the line at the end of the 16th stage, a 209-km ride from Moirans-en-Montagne on Monday.
Briton Chris Froome stunned his passive rivals to snatch the overall leader's yellow jersey in the Tour de France when he won the eighth stage with a lightning attack on the final descent on Saturday.