The eBay example, by the way, is ISAPI, not CGI.
Thus, there's no absolute rule that serving a static state must faithfully map to filesystem representation except convenience. Nor, do dynamic requests need to map to include the details of dynamic handler URIs unless the application cannot change generated links.
Revealing backend state, while somewhat Security Through Obscurity (STO)(TM), it's unwise to volunteer extraneous information without a purpose. Preferably, some other simple, one-way hash external representation should be used.
I played client-side Netscape JS and Apache HTTPd CGI bash shell scripts (not even Perl) to write a toy multiuser chat app in 1996. IIRC, it used a primitive form of long polling where it kept an HTTP/0.9 session open with keepalive commands periodically and then broadcasted the message received to all other users who were also connected.
3.3M LoC C++, that must have been quite painful.
Likewise with ASP.NET on Windows land, as ASP with VB, and C++ alongside COM wasn't that great either.
[0] - By the time this started to matter Java 1.3 was already the common version.
I also used to ask myself why they would expose the filename of the DLL.