SAN FRANCISCO -- Everybody on the San Francisco 49ers understood the plan perfectly: Get the ball to Vernon Davis.
He lined up as a wide receiver and in his natural spot at tight end. He made an acrobatic, over-the-shoulder catch on the sideline even coach Jim Harbaugh thought was nearly impossible, and Davis went straight over the middle for big gains, too.
"It's just one of those days, when you're in the zone," Davis said. "It's a beautiful thing."
If Davis keeps this up, perhaps San Francisco can stop worrying about the passing game until Michael Crabtree returns from injury as soon as next month.
Colin Kaepernick threw for 252 yards and Frank Gore rushed for 101 yards on 25 carries for his second 100-yard game of the season. Kendall Hunter ran for a 6-yard touchdown that sealed it for the 49ers (4-2) with 6:35 remaining.
Rookie safety Eric Reid made his team-leading third interception and also recovered a fumble to stop an Arizona drive deep in 49ers territory in the third quarter. San Francisco forced four turnovers for the second successive game.
"There's a direct correlation to winning games in the National Football League when you get those turnovers," safety Donte Whitner said.
A tough day for Arizona (3-3) became frightening when the Cardinals lost star defensive end Calais Campbell to an unspecified injury late.
For the 49ers, this balanced offensive performance was something they have searched for from Week 1.
"I'm going to give Vernon his chances when I can," said Kaepernick, who got back on track after four straight games of fewer than 200 yards passing. "He makes a lot of great plays."
Trailing 22-14 late in the second quarter, the Cardinals missed a big opportunity to take momentum into halftime.
Floyd redeemed himself with a 10-yard TD reception midway through the third quarter when he got by Brown in the left corner of the end zone. But Arizona failed on a 2-point conversion try, leaving the 49ers up 22-20.
The Cardinals' much-improved defense took a big blow when Campbell was carted off with 4:56 left. He was hurt when he landed awkwardly on a tackle of Gore.
"He left the field with movement and the feeling was coming back," coach Bruce Arians said. "He had numbness. It was precautionary."
Fitzgerald didn't seem hampered by a tender hamstring when he got between two defenders as the 49ers tried for another interception, and his touchdown put Arizona ahead 7-6 late in the first quarter.
There was some question whether Fitzgerald would play, with the Cardinals gearing up for two games in a five-day stretch. The Seahawks visit the desert Thursday night. But he played in his 96th straight game.
After Fitzgerald scored, San Francisco took charge in a wild sequence.
But San Francisco turned that bad break into a go-ahead safety when Corey Lemonier took Palmer down in the end zone for his first career sack, putting the 49ers ahead 8-7.
Two plays after Arizona's free kick, Kaepernick found Davis for the 61-yard TD.
Yet again, Arians referenced the "self-inflicted wounds."
"You can't come into a place like this and do that against a team like this and expect to win," Palmer said.
The Niners managed just 6 total yards of offense over their initial four possessions, a trio of three-and-outs and a field goal. San Francisco turned two first-quarter interceptions returned to the 11 and the 7 only into a pair of field goals by Phil Dawson, who had three in all.
Anquan Boldin made three catches and reached reception No. 800 for his career while facing his former team. He couldn't get a hold of a low 20-yard pass on the first play.
Boldin head-butted safety Tyrann Mathieu after he took down Hunter on the touchdown and both were flagged for personal fouls.
Anything to the milestone of 800?
"Nothing," Boldin said. "We've got to win. That's all that matters."
The 49ers lost NT Glenn Dorsey at the 9:20 mark of the first quarter with a right hamstring injury. He is the team's second injured NT after starter Ian Williams went down with a season-ending broken ankle in a Week 2 loss at Seattle, and Harbaugh expects to fill the spot from within this week. ... Arizona outgained San Francisco 403-387.