Alan Lee, Owen Garvan and Pablo Counago were all denied by brilliant saves from Adriano Basso as Town dominated the second-half at Ashton Gate without any reward.
Marvin Elliott gave the Robins a fifth minute lead with a strike from distance and Bradley Orr made it two from the penalty spot just past the half hour mark after Alex Bruce was judged to have handled in the box.
Blues responded well in the second-half following the introduction of Counago early on, the Spaniard denied by Basso on two occasions, with Lee and Garvan also thwarted by the Ashton Gate No.1.
Chances came and went through that second period but Bristol held on to get revenge for that 6-0 defeat at Portman Road as Town's run of games without an away win stretched to 14.
Jim Magilton made three changes to the side that drew at home to Barnsley, Tommy Miller and Billy Clarke dropping out of the 16 with Pablo Counago starting on the bench. Sylvain Legwinski, Gary Roberts and Owen Garvan coming in.
Town got off to the worst possible start though, Elliott taking the ball from Orr and firing past Neil Alexander from 25 yards to give the Robins the lead.
Elliott caught Garvan with a late challenge soon after, the midfielder escaping yellow though. Roberts and Ivan Sproule didn't though on 14 minutes, referee Andy Hall booking both players after the Bristol flyer had fouled Roberts initially.
It was the Town winger's fifth yellow card of the season, meaning a suspension for the game against Leicester.
Lee had a shot blocked by Jamie McCombe on the edge of the box, Lee Johnson then seeing a strike at the other end beaten out by Jason De Vos.
Lee shot just wide midway through the half but it was the home side who struck again, Orr converting a penalty after Bruce was judged to have handled.
Jon Walters, playing alongside Lee in attack, did well to create an opening as Town looked for a way back into the game, his shot blocked with Roberts' follow-up shot looking destined for the net until a deflection took it over.
Legwinski was close to getting on the end of a corner as Town pressed before the break but it was Bristol who almost added a third just before the half-time whistle, Enoch Showunmi's cross well marshalled by De Vos as the ball flew across goal.
No changes for either team at the break with the first attacking play of the second-half going Town's way, Roberts' free-kick cleared after Walters had been fouled.
Walters almost capitalised on a heavy touch by Adriano Basso as the City goalkeeper struggled to deal with a backpass, the Brazilian just clearing his lines.
Alexander had to be alert to clear from Showunmi before Town made the first change of the game on 55 minutes, Counago coming on to partner Lee in attack, with Walters dropping back into midfield, Legwinski making way.
Town could and should have been level five minutes later, Lee denied by Basso, the 'keeper then blocking Counago's shot on the rebound, with Garvan unable to convert the loose ball.
Great link up play between Counago and Lee set up Garvan again with the young Irishman's shot going close as Town started to threaten the home goal.
Garvan was in the thick of the action again seconds later, the midfielder's shot blocked by McCombe, the Republic of Ireland U21 international then having a header hacked off the line as Town turned up the heat on the Robins' goal.
Lee Trundle replaced David Noble on 65 minutes in Bristol's first change, the former Swansea frontman immediately in the action, his cross evading Showunmi. Alexander then saving comfortably from Elliott.
Sproule then showed his blazing pace to lead a Robins' counter attack, the flying Scot firing just past the post before both sides made second changes, Darren Byfield replacing Showunmi and Fabian Wilnis coming on for the injured Bruce.
Gavin Williams picked up a yellow card for a foul 15 minutes from time, Town clearing the danger from the free-kick, then at the other end Counago was denied by a crowd of Robins' defenders after taking a Roberts cross in his stride.
Roberts wasted a free-kick with his last kick of the game before being replaced by Danny Haynes 12 minutes from time. Cole Skuse then taking over from Sproule in Bristol's last change.
Garvan brought another terrific save from Basso, Counago blazing the rebound over with eight minutes left on the clock. The 'keeper then saving well from Williams' low shot.
Another crack from Garvan, from a free-kick after Counago had been fouled on the edge of the box, fell to Wilnis inside the box and the Dutchman did well to get a snap shot in but it was a foot too high in Blues' last opening.
Bristol City: Basso, Orr, Carey, McCombe, Fontaine, Sproule (Skuse 78), Johnson, Elliott, McIndoe, Noble (Trundle 65), Showunmi (Byfield 76) . Subs not used: Weale, McAllister. Booked: Sproule.
Town: Alexander, Wright, De Vos, Bruce (76) Harding, Williams, Legwinski (Counago 55), Garvan, Roberts (Haynes 78), Lee, Walters. Subs not used: Trotter, Supple. Booked: Roberts, Williams.



















