For a 49ers team that didn't have much to play for, linebacker Patrick Willis and a suddenly sturdy San Francisco defense certainly did their job as spoilers.
Willis had 14 tackles and a forced fumble in a 10-3 win over Buffalo on Sunday that all but ended the Bills' dwindling playoff hopes. The 49ers' win also prevented the Arizona Cardinals from clinching the NFC West and their first playoff berth in 10 years -- the longest active playoff drought in the NFL.
Isaac Bruce scored on a 12-yard touchdown pass -- the 90th of his career -- and Joe Nedney hit a 50-yard field goal as the 49ers never trailed. San Francisco (4-8) won for the second time in three games and second time for interim coach Mike Singletary.
The Bills (6-6) lost for the fifth time in six games and looked nothing like a team coming off a 54-31 win at Kansas City, or the team that got off to a 4-0 start.
Buffalo came away with no points on four trips inside the red zone, and also got nothing on two extended drives of 15 plays or longer.
The first drive, an 18-play, 85-yarder, ended when Rian Lindell banked a 20-yard field goal attempt off the left upright. The second, a 15-play, 75-yarder, ended when backup quarterback J.P. Losman, pressured by end Ray McDonald, threw an incompletion on fourth-and-2 from the 49ers 7 in the fourth quarter.
Lindell, who entered the game having hit 53 consecutive attempts from inside the 40, also missed a 40-yard attempt, which he banked off the left upright.
The Bills' last gasp drive ended when Losman threw two incompletions, was sacked for a 5-yard loss, and then threw a 1-yard pass to Marshawn Lynch on fourth-and-15.
Losman took over at the start of the second half after starter Trent Edwards was sidelined with a groin injury.
The game was a defensive battle in sloppy conditions, with a cold drizzle pelting the field for most of the afternoon.
The 49ers opened the scoring on their first possession, when Shaun Hill hit Bruce on a 12-yard pass to cap a methodical 14-play, 72-yard drive. Bruce faked going inside and then burst outside, beating rookie cornerback Leodis McKelvin.
Hill finished 14-of-23 for 161 yards and a touchdown, while Frank Gore had 66 yards rushing and a lost fumble.
San Francisco won despite managing just 195 yards offense while giving up 350 yards to Buffalo.
Bills running back Marshawn Lynch had a season-best 134 yards rushing, but lost a fumble at midfield late in the second quarter that led to Nedney's 50-yard field goal.