Skip to Content
CodingUseful ToolsLocalhost HTTPS Reverse Proxy

Localhost HTTPS Reverse Proxy

Custom local domain names

You can also just use anything.here.localhost and it will work.

If you want a custom domain extension, like .test do this:

$ brew install dnsmasq $ mkdir -pv $(brew --prefix)/etc/ $ echo 'address=/.test/127.0.0.1' >> $(brew --prefix)/etc/dnsmasq.conf $ sudo brew services start dnsmasq $ sudo mkdir -v /etc/resolver $ sudo bash -c 'echo "nameserver 127.0.0.1" > /etc/resolver/test'

Validate:

$ scutil --dns

should show something like:

resolver #8 domain : test nameserver[0] : 127.0.0.1 flags : Request A records, Request AAAA records reach : 0x00030002 (Reachable,Local Address,Directly Reachable Address)

Set up local HTTPS

$ brew install mkcert $ mkcert -install $ mkcert -cert-file localhost-cert.pem -key-file localhost-key.pem "*.localhost" localhost 127.0.0.1 ::1

Reverse proxy

In Node:

const app = require('express')(); const { createProxyMiddleware } = require('http-proxy-middleware'); const https = require('https'); const path = require('path'); const fs = require('fs'); const os = require('os'); app.use( '/api/', createProxyMiddleware({ target: 'http://127.0.0.1:8000', changeOrigin: false, pathRewrite: {}, }), ); app.use( '/', createProxyMiddleware({ target: 'http://127.0.0.1:4200', ws: true, // needed for hot reload in most UI frameworks changeOrigin: false, pathRewrite: {}, }), ); // listen on port 80 for HTTP app.listen(80, '0.0.0.0', () => { console.log('HTTP listening on port 80'); }); // listen on port 443 for HTTPS const server = https.createServer({ key: fs.readFileSync(path.join(os.homedir(), 'localhost-key.pem')), cert: fs.readFileSync(path.join(os.homedir(), 'localhost-cert.pem')), }, app).listen(443, () => { console.log('HTTPS listening on port 443') });