Ehsan takes set pieces for Sepahan and plays both in central and left midfield, having scored six league goals for Sepahan in the 2007–08 season. In the last game of the league match against Persepolis, Hajsafi scored a goal for Sepahan that could have granted Sepahan the title, but Persepolis scored the vital winning goal in stoppage time to win the title. He continued to perform well and scored wonderful goals for Sepahan in the 2008–09 season. He was tested as the left back in the 2009–10 season when Sepahan won the league, and extended his contract with Sepahan for two another years.[6]

In June 2011, Hajsafi signed a one and a half year loan conscription contract with Tractor Sazi, reuniting him with former coach Amir Ghalenoei.[7] Tractor finished second in the league, their best results in club history. His contract with Tractor ended in January 2012, and he returned to Sepahan.

Hajsafi returned to Sepahan in January 2012, beginning this time with coach Zlatko Kranjčar. He won the Hazfi Cup with the team and extended his contract with Sepahan for another two seasons at the end of the season. In August 2014 after the end of his contract Hajsafi was close to signing with Championship side Fulham, but the deal fell through due to work permit issues.[8] Hajsafi returned to Iran and extended his contract for another two seasons with Sepahan.

On 30 August 2015, Hajsafi joined FSV Frankfurt in the German 2. Bundesliga with a two-year contract.[9] He made his league debut on 13 September 2015 as a second-half substitute against Eintracht Braunschweig.[10] He made his first start a week later as a left-back on 20 September in a 1–0 league win over MSV Duisburg.[11] Hajsafi quickly established himself as the set-piece taker. Hajsafi scored his first goal for FSV Frankfurt on 2 March 2016 in a 3–3 draw against MSV Duisburg.[12] On 13 March 2016 Hajsafi scored from 50 yards against Freiburg.[13]

After FSV was relegated to the 3. Liga, the club announced that they had annulled the contract of Hajsafi and he was a free agent and could sign with any club.

On 24 June 2017, Hajsafi signed a two year contract with Greek Super League side Panionios. He is set to team up with fellow countryman Masoud Shojaei at Panionios.[14] Hajsafi became the third Iranian in recent years to play for the club.

Hajsafi made his first appearance for the club on 13 July 2017 in a second round Europa League qualifying match against Slovenian club Gorica. On 20 August 2017, on his league debut with Panionios, Hajsafi recorded an assist from a corner kick.

On 29 December 2017, after six months with Panionios , Hajisafi reached an agreement with Greek side Olympiacos, signing a three and a half years' contract for a transfer fee of €600.000. His contract, was worth €400.000 per year.[15] The 27-year-old player was the team’s first transfer in the January window. On 11 February 2018, he made his debut with the club in Super League as a starter, scoring a late goal as he bundled home the rebound to sealed a point for Olympiacos when Atromitos keeper Andreas Gianniotis saved Uros Djurdjevic’s penalty-kick.[16]

On 1 June 2014, he was called into Iran's2014 FIFA World Cup squad by Carlos Queiroz.[17] He played the full 90 minutes in Iran's first match against Nigeria which ended 0–0. He then started in a match against Argentina and was one of the key players in the match. He substituted in the 88th minute and then Argentina scored their lone goal by Lionel Messi. He also played 63 minutes in Iran's final match against Bosnia and Herzegovina. Iran were eliminated in the group stages. He was called into Iran's 2015 AFC Asian Cup squad on 30 December 2014 by Carlos Queiroz.[18] On 11 January 2015, in Iran's opening match of the tournament, Hajsafi scored the first goal and was named man of the match in a 2–0 win against Bahrain.