I am looking for a solution to forward one public IP address and one specific port to different machines based on hostname (as of now, I need it only for HTTP).
The current setup is NAT on a commodity router (it only provide simple public port to private IP address / port forwarding). I can add a Windows Server 2008 R2 machine before the router if required, but prefer not to do so.
So ideally, I would like to have the current setup and the forwarding is done on one of the Windows Servers. Is it possible to do this?
Sounds like what you want is really name based virtual hosts.
http://httpd.apache.org/docs/2.2/mod/core.html#namevirtualhost
Try using Apache's name based virtual hosts and mod_proxy to redirect it to another host.
The above will catch the example.com and other_example.com on your front facing IP address and then pass each of them off to a different IP address.
You can buy very expensive devices from Cisco, f5 and others which do this, or more simply you could setup an instance of squid cache to listen for incoming requests and then either rewrite the URL on squid or maintain local name/address mappings in your hosts file.
If you need to handle HTTPS, then run an instance of stunnel in front of the HTTP proxy to terminate the SSL.