This comes down to a misunderstanding of what happens with the / character in URLs and how to use _lookup. I don't know that I have good examples for how to use _lookup, so I can't help there, but the other part I can explain:
TG separates the URL based on the / character. It goes to the top most controller (RootController), and says "Do you know how to handle /media". The RootController has a MediaController named "media", so it goes to that controller and asks about the next item: news. Since that controller has a NewsController named "news", it goes to the NewsController and asks it how to handle the next part.
You have a method named index, so whenever the next part is named "index", it passes everything to that method. That covers "/index/<value-of-param>" and "index?url=<value-of-param>". If there is nothing after the final / TG assumes you want to get the index method called, so uses that method. That covers "news/" and even "news?url=<value-of-param>" since there's a hidden / between "news" and "?url=" (that's how TG interprets it).
The final one, though, doesn't cover any of these cases. "news/<value-of-param>" doesn't actually match anything. NewsController is asked "do you have any attribute named <value-of-param>" and it doesn't, so it can't process it. It returns a 404. What you would need to do is add a method named _lookup() that would then tell TG that the index method knows how to handle <value-of-param>.
As I said, I don't have examples to share for this right now, so I can't do much to give code. I'm sorry. But at least this provides an explanation for what to do next.