1
0
mirror of https://github.com/danbee/danbarber.me.hugo.git synced 2025-03-04 08:59:18 +00:00

Add local mac resolver post

This commit is contained in:
Daniel Barber 2020-01-03 21:43:58 -05:00
parent d15c13cb9e
commit 69eb859056

View File

@ -0,0 +1,89 @@
---
layout: micropost
date: '2020-01-03T21:45:00+00:00'
title: The web without the web
slug: the-web-without-the-web
categories:
- internet
- web
- dns
- web development
---
For a good number of years I was using Basecamp's Pow for local web development
and one of my favourite features was the in built local DNS resolver that meant
that `*.dev` would resolve to `127.0.0.1`. This mean that I had a unique
hostname for every site I was building and running locally which I have found
incredibly useful.
Unfortunately Pow no longer sees active development (the GitHub repo has been
archived) so I wanted to see if I could set up the same kind of local resolver
on my Mac without using it.
It turned out to be pretty straightforward!
<!--more-->
Note: We're using `.localhost` instead of `.dev` because Google own the `.dev`
TLD and in 2017 they added an HSTS rule to Chromium that forces any `.dev`
domain to use HTTPS. As you can imagine, this is not ideal for local development
so web developers everywhere had to adjust their setups.
First of all we need to install Dnsmasq. This will handle the local name
resolution. If you're using Homebrew this is dead simple:
```bash
$ brew install dnsmasq
```
Then we need to configure it to resolve any domain name that ends in
`.localhost` to resolve to `127.0.0.1`.
Uncomment the following line:
```bash
# /usr/local/etc/dnsmasq.conf
conf-dir=/usr/local/etc/dnsmasq.d
```
Add the following file to the Dnsmasq configuration directory:
```bash
# /usr/local/etc/dnsmasq.d/localhost
address=/.localhost/127.0.0.1
```
Start `dnsmasq` as root (It needs to be running as root to be able to bind to
port 53):
```bash
$ sudo brew services start dnsmasq
```
Next we need to tell macOS about the local resolver.
Add the following file (You will need to do this as `root`):
```bash
# /etc/resolver/localhost
nameserver 127.0.0.1
domain localhost
search_order 1
```
And voila! Any domain ending in `.localhost` should now resolve to `127.0.0.1`.
We can test this with a ping:
```bash
$ ping foobar.localhost
PING foobar.localhost (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.122 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.262 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.281 ms
```
## So why is this useful?
That's a very good question! Here's some of the reasons I've found:
1. If you're developing an app that relies on a number of small services it can
be useful to differentiate them by domain.
2. It makes OAuth callback URL's more readable.
3. It's useful for external services that require a domain name to authenticate.
A good example of this is font services such as Typekit or Hoefler & Co.
4. It just looks pretty up there in the URL bar!