We previously had a setup which achieved this however we set the change from resolved to closed only until 6 months were past. This was primarily done to discourage people re-opening old tickets for things unrelated to the original ticket. As Kevin mentions you can have a Closed status which doesn't allow re-opening.
For the status change we used a third-party plugin called autocloser which I think still works even with 1.17x however we stopped using it after our upgrade to 1.17.x .
It is one less third-party plugin needed, plus we found this change in status was causing issues in some of our reports as the "last changed date" was being set to 6 months after the last actual change. Some reports were ok, but these tickets would also show up in the closed queue.
There is also a new feature which makes it easier to manage when people re-open tickets with unrelated requests.
You can use the small drop down on the right side of their entry and choose to "Create Ticket"
This is much better in my view, as it allows agents to make a decision about if a new ticket is required or not.