Ivan Sproule's injury-time goal ensured Bristol City's unbeaten league run stretched to nine games while leaving Southampton deep in relegation trouble.
City's Bradley Orr saw an early penalty saved and Saints hit the post twice before Dele Adebola latched on to Gavin Williams' pass to put the Robins ahead.
Kayne McLaggon tested home keeper Adrian Basso after the break and Jason Euell missed a tap-in from six yards.
And Saints paid dearly when Sproule raced the length of the pitch to score.
Bristol City boss Gary Johnson:
"Southampton put us under pressure but we defended when we had to and earned our win.
"Things are going very well for us and we are confident about making the play-offs, not in an arrogant way, but because we have faith in one another."
Southampton manager Mark Wotte:
"I can't fault them for what they did in the second half. But we play to score goals and didn't, which is why we are in our current position.
"I think we have better quality strikers, but at the moment we are finding it hard to get goals and that has to change.
"I can't believe we lost. The least we should go home with is a point."
Bookmark with:
What are these?