Skip to content

Instantly share code, notes, and snippets.

@bsmirnov
Forked from exupero/README.md
Created August 1, 2012 18:36
Show Gist options
  • Save bsmirnov/3229646 to your computer and use it in GitHub Desktop.
Save bsmirnov/3229646 to your computer and use it in GitHub Desktop.
Alias a domain to a local port (Mac)

I run a lot of web servers for different projects, all of them on different ports. Generally I start with port 8000 and increment from there as I spin up new servers, but it became tiresome to remember what projects were running on which ports and what the next available port was.

/etc/hosts won't let you specify a port, but a combination of aliasing 127.0.0.1 to 127.0.0.X, forwarding ports from 8000 to 80, and adding the 127.0.0.X IP under an alias in /etc/hosts did work.

This script finds the next available value of X, aliases it with ifconfig, forwards the given port to port 80 with ipfw, and adds a new entry to /etc/hosts that aliases the IP to the domain you want.

Now I can add a server alias with sudo domain-alias funproject 8000, run the web server at 127.0.0.X:8000, and load up http://funproject/ in my browser.

(Because I needed it to work on a Mac, I couldn't use iptables. ipfw seems to work, though its manpage claims it's deprecated and pfctl is the way to go. I wasn't able to figure out pfctl, so ipfw it is.)

#!/bin/bash
# Usage: sudo domain-alias myapp 8000
domain=$1
port=$2
last=$(cat /etc/hosts | grep -oP "127.0.0.\d" | cut -d'.' -f4 | sort -n | tail -1)
next=$(expr $last + 1)
localip="127.0.0.$next"
{
ifconfig lo0 alias $localip
ipfw add fwd $localip,$port tcp from any to $localip dst-port 80
echo "$localip $domain" >> /etc/hosts
} && echo "Done. Run apps at $localip port $port and view them at http://$domain/."
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment