Chrome routes http://0.0.0.0:* to Google Search
code.google.com
code.google.com
> Yes, I ment to navigate to 0.0.0.0 to test the jekyll generated website.
> That's where jekyll points me to (console output says
> "Server address: http://0.0.0.0:4000/" It works just fine on all browsers but
> the latest Chrome.
Yeah, that's really misleading output from jekyll.My own tool outputs [1] something like this:
serving, available at:
http://localhost:8080/index.html
http://10.0.0.10:8080/index.html
Which are the two IPs that are reachable when I do http.ListenAndServe(":8080") in Go, and they're copy-pasteable into a browser without needing it to recognize invalid IPs.[1] https://github.com/shurcooL/cmd/blob/8d16351d1f01caca2ac65b9...
If a large amount of users depend on a behavior, then you don't break it for a lousy "the specs says so" reason.
Glad I wasn't losing my mind, but this certainly is something people use, I guess it should probably be allowed.
That said, I think a local server that's listening on all interfaces/addresses should probably feel confident to say "please open http://localhost:NNNN" I've definitely seen neophytes to various tech get anxious about numbers appearing where they expect a name, and it's less clear what 0.0.0.0 is, if maybe it's something special and different from the "localhost" they're accustomed to (because it is... at least in theory).
Both of those are pretty odd cases, so I'm not sure how much they're worth worrying about.
$ sudo ifconfig lo 0
$ ifconfig lo
lo Link encap:Local Loopback
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING [... the rest omitted for brevity]
$ ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
^C
--- 127.0.0.1 ping statistics ---
32 packets transmitted, 0 received, 100% packet lossBy binding to 0.0.0.0:PORT the guest OS will make your service available on all enabled interfaces:PORT combinations which, hopefully will "just work" in most use cases.
So... what interface does 0.0.0.0 resolve to? Is the loopback interface the default if a routing pattern match falls off the end of the route table? I really wouldn't expect that, given that the default of "no special subnet used" should end up routed out to the WAN.
0.0.0.0 results in the input being interpreted as a search query rather than an address
Another 'while I'm at it' question I've had for a while. Say you have a micro-service bound to local loopback, you don't want remote code touching it. E.g. I think the BitTorrent Sync WebUI will provide the private keys to any local loopback connection. It can't possibly be secure though, right?
Offhand, the BitTorrent Sync WebUI thing has a rather bad smell to it. There are ways to protect that info from getting out, but it's definitely suspect.
Actually, thought: can javascript running on a web page make AJAX requests to 127.0.0.1 and access this bittorrent sync thing? I'd think CORS would prevent it, but that might be a danger.
who, when entering "http://*" would expect a search, and when entering "http://*.*.*.*:*" would still expect a search?
after that, it should let the lower levels respond with any error messages if there are (it is not the fault of firefox or chrome that it can be used as a destination address)
I'd also like a shorter notation for 'this is not a search' I think ending a word in / is probably good enough for that?
I mean, I'm not saying it should go to Google Search, it should just go to a no-host-found page.
Making these kind of exceptions leads to more people doing illegal things, and then it's hard to know if you're doing something right because browsers won't help you figure out that you're breaking rules. Which makes everything more confusing.
I believe it's a nice side-effect of the underling system because it also works on all cli programs (e.g. "ping 0")
∆∆∆: python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 ...
Edit: formattingThere's also ::ffff:0.0.0.0 and ::ffff:127.0.0.1, which behave like their corresponding IPv4 addresses if IPV6_V6ONLY isn't enabled on the socket.
In any case, if you have server code that only listens on 0.0.0.0 (or ::ffff:0.0.0.0, if you're crazy), it's obsolete now because it's unable to accept IPv6 connections. A modern server should either listen on :: with IPV6_V6ONLY=0, or set IPV6_V6ONLY=1 and create two sockets listening on :: and 0.0.0.0.
One annoying thing about the socket API is that binding to loopback always requires two sockets, one for 127.0.0.1 (or ::ffff:127.0.0.1) and another for ::1.
And if you ever create a listen API that accepts "localhost:8080" as input, but only creates one socket for one address, then a pox on your house.