For a second straight game at the World Cup, France was pushed to the brink but it emerged with three points. And for a second straight game, Peru pressured its opponent only to come up short.
Kylian Mbappe scored on a first-half tap-in, becoming France's youngest goalscorer ever in a major competition, and Les Bleus held on in the face of Peru's persistent attack to win 1-0 and clinch a place in the round of 16 in Ekaterinburg. With the second straight 1-0 loss, Peru has been eliminated from contention and will have only pride to play for in the Group C finale against Australia. The Socceroos will need a win and a Denmark loss to France to have a shot at following Didier Deschamps' side into the last 16.
On Thursday, Peru supporters continued their incredible support of their national team, as evidenced by a second straight rousing rendition of the nation's anthem.
On the field, the opening 10 minutes marked more of a feeling-out process marked by some physical and choppy play, with neither side able to create any genuine early opportunities. Peru had the two early highlights, with Yoshi Yotun trying an audacious chance from the center circle and when Andre Carillo juked Lucas Hernandez to get to the endline and cross, but the flashy play ultimately didn't lead to anything.
Paul Pogba nearly put France on the board in sensational fashion in the 11th minute, picking up his head and ripping a bouncing blast from 30 yards that whizzed by a diving goalkeeper Pedro Gallese and the far post.
Three minutes later, Raphael Varane had a great opportunity off the second of two consecutive corners, leaping high and glancing his header across the goal mouth but beyond the far post as well.
It was Antoine Griezmann's turn to pepper Gallese's goal next, with Olivier Giroud rising high to head down a ball over the top for Griezmann, who hit it first time from 18 yards out. Gallese got down and made a kick save, though, denying the Atletico Madrid star and keeping it 0-0.
Peru finally tested France goalkeeper Hugo Lloris at the half-hour mark. Paolo Guerrero received a slip pass from the left and took a great touch to create space with Samuel Umtiti defending him, but his left-footed chance from in close was denied by Lloris, who made a strong save to keep the game scoreless.
Kylian Mbappe gave France the lead in the 34th minute. Moments after he received a pass from Pogba and attempted a back-pedaling back-heel in front of goal, he had a Giroud shot that was blocked fall into his path at the goal mouth, where he tapped in to make it 1-0. The play started with Pogba winning the ball back and slipping a pass for Giroud down the left channel.
France nearly made it 2-0 just before halftime through Hernandez, who had Griezmann spin a pefect set-up pass for him in the left-hand side of the box. He drilled his shot right at Gallese, though, and the rebound was hit harmlessly wide.
Fighting for its World Cup life, Peru went in search of the equalizer, and it nearly came five minutes into the second half. Pedro Aquino wound up with a shooting lane some 25 yards out, and he sent a missle toward the upper left-hand corner, only for it to ping off the crossbar.
Carillo then took his turn from long distance after a gorgeous passing sequence, lining up a 30-yard blast but putting it comfortably over the crossbar for Lloris and France on the hour mark.
Peru continued to pressure, pinning France back in its end for much of the second half but unable to break through on the scoreboard. It was a similar script to Peru's opener against Denmark, except in that match it was at least able to carve out chance after chance only to be denied. Here, Peru's possession and pressure wilted in the final third.
Ousmane Dembele, on as a substitute for Mbappe, nearly iced it in the 82nd minute, freeing himself up for space 15 yards from goal and straightaway, only to hook his left-footed chance wide of the right post.
As Peru kept pushing for a desperate equalizer it won a foul in a dangerous spot on the field, and Guerrero lined up a 30-yard free kick. He was able to get it up and over the wall, but it died in time for it to fall for Lloris, who got down low to make the simple catch and did not concede a rebound.
Here were the lineups for both teams:
Here are the rosters for both sides:
Goalkeeper: Alphonse Areola (PSG), Hugo Lloris (Tottenham), Steve Mandanda (Marseille)
Defenders: Lucas Hernandez (Atletico Madrid), Presnel Kimpembe (PSG), Benjamin Mendy (Manchester City), Benjamin Pavard (Stuttgart), Adil Rami (Marseille), Djibril Sidibe (Monaco), Samuel Umtiti (Barcelona), Raphael Varane (Real Madrid)
Midfielders: N'Golo Kante (Chelsea), Blaise Matuidi (Juventus), Steven N'Zonzi (Sevilla), Paul Pogba (Manchester United), Corentin Tolisso (Bayern Munich)
Forwards: Ousmane Dembele (Barcelona), Nabil Fekir (Lyon), Olivier Giroud (Chelsea), Antoine Griezmann (Atletico Madrid), Thomas Lemar (Monaco), Kylian Mbappe (PSG), Florian Thauvin (Marseille)
Manager: Didier Deschamps
Goalkeepers: Pedro Gallese (Veracruz), Carlos Caceda (Deportivo Municipal), Jose Carvallo (UTC)
Defenders: Aldo Corzo (Universitario), Luis Advincula (Lobos Buap), Christian Ramos (Veracruz), Miguel Araujo (Alianza Lima), Alberto Rodriguez (Atletico Junior), Anderson Santamaria (Puebla), Miguel Trauco (Flamengo), Nilson Loyola (Melgar)
Midfielders: Renato Tapia (Feyenoord), Pedro Aquino (Lobos Buap), Yoshimar Yotun (Orlando City), Paolo Hurtado (Vitoria Guimaraes), Christian Cueva (Sao Paulo), Edison Flores (Aalborg), Andy Polo (Portland Timbers), Wilder Cartagena (Veracruz)
Forwards: Andre Carrillo (Watford), Raul Ruidiaz (Morelia), Jefferson Farfan (Lokomotiv Moscow), Paolo Guerrero (Flamengo)
Manager: Ricardo Gareca