In short to answer your question, yes there is a way to do this.
But first I will ask, are you familiar with Zend Framework and MVC (Model-View-Controller)?
If not, here is what is happening (note: I have only briefly looked at Magento’s source but this is from my experience with Zend Framework):
Every page request is redirected to “index.php” and then the Zend Framework breaks down the URI_REQUEST from there:
Everything after that point is defining a parameter (or in many applications this would be the query string which you may be familiar with. In this instance it would look like this: “?s=surf&id;=29") However, for search engine optimization purposes, Zend Framework puts the query parameters in the URL to look like a directory tree.
So, I would like to know why you think these are “long” URL’s. In my opinion, these describe what page the user is requesting very well and therefore they can anticipate what content they are going to get before they load the page. They are rather concise compared to many URL’s I see nowadays. But if it is really a big issue to you you can define custom routes in Zend Framework to do what you are asking.
Something like this for this scenario (again, not tested this in Magento but as long as they are using the traditional Module Rewrite this should be about right):
$route = new Zend_Controller_Router_Route(
'module' => 'catalog',
'controller' => 'category',
'action' => 'view',
's' => 'surf',
'id => '29'
Please don’t come murder me if that code doesn’t exactly work. That was off the top of my head (It more than likely won’t work, it should give you an idea of what to do I hope.)
(more here: http://framework.zend.com/manual/en/zend.controller.router.html)