Cannot play MP4 video on LAN in iOS through asset pipeline, but can from WAN

I’m trying to embed a <video> on my site and show it in a dialog box. I thought there was a JavaScript problem, but I narrowed it down to that fact that iOS Mobile Safari on iPhone will not play a mp4 file from a local network, even with a direct link. The link looks like http://localhost:3000/assets/introduction-0cf920e06b4224f8f83f59d02f878b7d5733b09590a14147d1580cbfb5081f18.mp4 except I changed localhost to the IP of my desktop server. It will load a black screen which is the same color as the first frame of the video with two dashes in the middle.

If I load a hotlink of the MP4 from staging, then it plays fine. It also plays fine in Chrome on the desktop.

I also tried to play in an iPad iOS 9.3.5 and it failed to play, but did display the whole play button, which did nothing.

If I copy the video to the /public folder, then it will play on iOS Safari. It seems to only fail when it goes through the asset pipeline, but only in development (same file in staging).

How do I play a MP4 video on iPhone Safari in development environment?

I funneled the iPhone through a Fiddler4 proxy and reloaded the page. It made two consecutive requests:

GET /assets/introduction-0cf920e06b4224f8f83f59d02f878b7d5733b09590a14147d1580cbfb5081f18.mp4 HTTP/1.1
Host: 10.0.0.14:3000
Upgrade-Insecure-Requests: 1
Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us
Connection: keep-alive
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.0 Mobile/14G60 Safari/602.1

HTTP/1.1 200 OK
Content-Type: video/mp4
Cache-Control: public, max-age=31536000
ETag: "0cf920e06b4224f8f83f59d02f878b7d5733b09590a14147d1580cbfb5081f18"
X-Request-Id: b97a488d-7141-434f-813d-af4848162a70
X-Runtime: 0.058637
Content-Length: 27555596

and

GET /assets/introduction-0cf920e06b4224f8f83f59d02f878b7d5733b09590a14147d1580cbfb5081f18.mp4 HTTP/1.1
Host: 10.0.0.14:3000
Range: bytes=0-1
X-Playback-Session-Id: A0C3C96E-6F17-47B1-A509-521B3A61D481
Accept-Encoding: identity
Accept: */*
Accept-Language: en-us
Connection: keep-alive
Connection: keep-alive
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.0 Mobile/14G60 Safari/602.1

HTTP/1.1 200 OK
Content-Type: video/mp4
Cache-Control: public, max-age=31536000
ETag: "0cf920e06b4224f8f83f59d02f878b7d5733b09590a14147d1580cbfb5081f18"
X-Request-Id: 273865e7-b389-4473-b565-75b2d7ac6559
X-Runtime: 0.038530
Content-Length: 27555596

iOS 10.3.3, iPhone 5, Windows 8.1, Rails 5