238 comments

[ 15.8 ms ] story [ 327 ms ] thread
What would have been nice is that depending on the visitors IP address’s region, showing a localised message instead of fixed number of languages
This feels like a “falsehood developers think about localization.”

It’s always funny when I get French YouTube ads. As if YouTube is desperately trying to offload the adbuys anywhere they can by pretending that Canada must mean French.

Do you have ca-fr (or whatever) in your accept language header?
I want to read content only in a specific language. This is different language than the language of the country I live in. I have my operating system, my keyboard layout, my browser, my accept languages header, everything configured to the language I want.

And get I often get websites and ads in the language of the country my IP points to

Google famously think they know better than you what languages you want.
I hate this with a passion. Google is very guilty of this. Their AI summary very often insists on replying in the (IP) local language, nevermind the language of my HTTP headers, Google profile, or the actual natural language request...
I believe it's just using the official languages of the UN
Interesting, didn’t know that. Also I would have expected German and Hindi to be official UN languages given the number of native speakers in the world
Guess most of German speaking and Hindi speaking also know English.
Just check the Accept-Language header
That assumes that (i) every region has a primary language, and (ii) everyone in that region speaks that language, both of which are false.

(And false often enough that guessing language based on IP address works badly in practice, I hear.)

it's nice, and it surprised me when I saw the redesign.... I use it to navigate into captive wifi portals that always seem to be misconfigured.
Same here! Yes, I used it as the well-known site that supported unencrypted http and no HSTS. Yes, I was one of those guys using the site "as a service" rather than simply documentation. Admittedly, it was perhaps interchangeable with other sites, but since it reliably worked for that purpose, I couldn't be arsed to find other ones.

Isn't there a dedicated site called nohttps or something? NeverSSL? I just tried http NeverSSL, and it redirected me to an https page with a random hostname and an Amazon SSL certificate!

Does example.com still function this way, with http and no HSTS? I noticed that my Chrome browser was immediately redirected in the customary way.

http://neverssl.com/online/ seems to work for me?

Are you perhaps on an untrusted network which is spoofing that url to make it redirect somewhere else?

No, NeverSSL changed to have SSL a while back - around the time that Chrome/Firefox started throwing big warning signs and/or blocking non-https pages.
Wait, are you saying neverssl.com now sometimes uses SSL?

If this is a joke, it's over my head. If not, I'm not knowledgeable enough in this space to pass judgement, but that would seem crazy to me. Like the owner should consider a domain name change :)

It has SSL on the main domain, and some subdomains without SSL (wildcard perhaps?). The main domain (when accessed over SSL?) redirects to a subdomain with plain HTTP.

Kinda weird setup!

Edit: okay, the subdomains also have SSL. I guess the random subdomain thing is to make sure it hasn’t been cached in a “this site has HTTPS” list. The HTTPS is needed, of course, to please the browser makers, as the parent says.

My browser (iOS safari) just takes me to the ssl version from that link, so “never ssl” seems wrong?
http://http.rip/ is one I use
Wow finally, a "no ssl" site that actually doesn't use SSL! I was so disappointed when "NEVERssl" added SSL, like you literally have ONE job. Some clients automatically upgrade http->https or prepend https if left unspecified, so it's nice to have an explicitly HTTP-only (IE port 80-only) service for testing/captive portals.

This is very useful, thanks for sharing!

> there's a gradual opacity transition

Looks like they removed this and instead just show all languages with no CSS animation now.

Aww, I was wondering if I was just looking at an older version. How disappointing. But I suppose, unsurprising given the conversation here. I'm sure such transitions would be bringing a surprising amount of instrumentation down.

It still probably is as it is now. But there's better arguments to support localization than transitions.

For some reason the localization still requires javascript... (I'm pretty sure the transition could have been done in just CSS as well)
> For some reason the localization still requires javascript

Well, no. The purpose of the redesign is to move as much of the page content as possible into an external javascript file. There's no question of what parts of the page require javascript; the question is what parts of the page can be moved into javascript.

Yes, the revised version that alternated through the translations was posted a week ago on Monday. It was revised to no longer do that on Friday based on reasonable feedback that it wasn't the best idea for accessibility. Now all the translations are presented together, but your preferred language will be bumped to the top based on your browser language preference.
Oh that's good, I had that complaint when it first changed. It was difficult to read the entire chunk of text before it transitioned to a different language. And then who knows how long it took to loop back round to english
> There is no requirement there is a HTTP service present on the host in order to fulfill its purpose, we just operate it as a courtesy.

I guess this is also done to prevent bad actors from abusing the fact that this domain is hit by people who might not know what they're doing (the ones copy-pasting code without reading it)

Yeah there’s definitely a lot of sensitive data that gets sent to the domain just because of people not changing configs
I don't understand, what risk would there be if they chose _not_ to run serve a site?
More the DNS and DNSSEC and the like. Whether or not there is actually an HTTP server responding is irrelevant to whether or not those securely point anywhere but a malicious system.
who's job was it to make incremental stylesheet changes on example.com in the 2010s?
The government. It was a top secret skunkworks project to see if centering a <div> was possible.
I see the government continues to try solving impossible problems in the shadows. A pity.
Whose. Who's is a contraction of who + is
> Along with introducing multi-language support, the JavaScript code also inserts an SVG book icon.

Wait - using JS for dynamic content is understandable, but why using it for inserting a static SVG?

Simple answer is the article is wrong, I tried it with disabled JS and still see the SVG.

The whole article reads like something put together with AI, so maybe it’s not too surprising.

You may want to check your settings again or clear you cache as there is definitely a `s.js`[0] file that inserts the `<svg>` element into the HTML DOM[1], which you can see does not contain the element itself.

0

```

var B = document.body, P, p; B.children[0].insertAdjacentHTML("afterend", "<p lang=ar dir=rtl>هذا النطاق مُخصص للاستخدام في أمثلة التوثيق دون الحاجة إلى إذن. هذه ليست خدمة، يُرجى تجنب الاعتماد عليها لأغراض الاختبار والمراقبة.</p><p lang=zh>该域名仅用于文档示例,无需获得许可。这并非一项服务,请勿将其用于测试和监控目的。</p><p lang=fr>L’usage de ce domaine est réservé à des exemples de documentation, sans autorisation préalable. Il ne s’agit pas d’un service ; son utilisation à des fins de test ou de surveillance est à éviter.</p><p lang=ru>Данный домен предназначен для использования в примерах документации без необходимости получения предварительного разрешения. Это не сервис; не рекомендуется его использование для тестирования и мониторинга.</p><p lang=es>Este dominio está destinado al uso en ejemplos de documentación sin necesidad de permiso. Esto no es un servicio; evitar utilizarlo para realizar pruebas o monitoreos.</p><a href=https://iana.org/help/example-domains>Learn more</a>"); P = [...B.querySelectorAll("p")]; P[0].lang = "en"; navigator.languages.some(l => p = P.find(p => p.lang == l.split("-")[0])); p = p || P[0]; B.prepend(p); B.insertAdjacentHTML("afterbegin", '<style>svg{display:block;margin:-2.75em auto 0;opacity:.55}p+p{font-size:.875em;opacity:.6}</style><svg viewBox=0,0,20,20 width=44 height=44 fill=currentColor aria-hidden=true><path fill=none stroke=currentColor stroke-width=1.3 stroke-linejoin=round d="M6 4H3v12q4 0 7 1.5-1-3.5-4-4.5V2q3.5 1 4 3v12.5q3-1.5 7-1.5V4q-4.5 0-7 1"/><g transform=rotate(-6,13.6,8.3)><path id=q d="M11.5 6.6h1.8v1.8l-1 1.6-.6-.3.8-1.3h-1z"/><use href=#q x=2.4 /></g></svg>')

```

1

```

<!doctype html> <html lang=en> <head> <meta charset=utf-8> <link rel=icon href=data:,> <meta name=viewport content="width=device-width,initial-scale=1"> <title>Example Domain</title> <style> html { color-scheme: light dark; background: light-dark(#eee,#222) }

            body {
                font: 16px/1.6 system-ui,sans-serif;
                max-width: 26em;
                margin: auto;
                padding: 25vh 2em 2em;
                text-align: center
            }
        </style>
    </head>
    <body>
        <p>This domain is for use in documentation examples without needing permission. This is not a service; avoid relying on it for testing and monitoring purposes.</p>
        <script src=/s.js></script>
    </body>
</html>

```

``` doesn’t work on HN, prepend two spaces to each line to get a code block.

Regardless, it’s a lot of code, so maybe better move it out to a pastebin/gist?

Reducing egress bandwidth, if you have automated clients that don't support JS you save precious bytes from being served by not embedding the SVG, which at example.com scale may be worth it
Why does this site need JS at all? It appears to inject all of the other languages via client side JS. Why can't they all just be served from the server?
To minimize their hosting costs. They get a large amount of automated traffic that won't actually render the content, so moving as much content as possible out of the initial HTML document is more efficient.
I wonder if it's injecting both through javascript to minimize breaking people's tests. Trying to reduce dealing with non-ascii characters and svg tags.
Discussed here a few days ago: https://news.ycombinator.com/item?id=49915060
And the "statement" in this article is the text from that email, disingenuously edited. I'm not sure why, but it rubs me the wrong way.
What makes you think it's edited?
Yeah apologies, bad wording on my part. I really just meant the removal of the opening line which made it clear that it was a correspondence: "I am happy to try and answer any questions you have."
The hilariously ironic thing is that Dunk, a Google Engineer, went out of their way to make a hyperlink of "example dot com" so that people could tap and visit the site, even where Davies' email specifically reiterates that the domain is for documentation purposes only and nobody should ever be actually visiting the site!

McCarthy of DebugBear clearly noticed this admonition and perhaps the mistake as well, because they have carefully highlighted "example.com" without linking to it, although they apparently have visited the site in order to copy and cite screenshots and unpack the CSS, and describe an extensive history of it.

We (IPinfo) have a practice of adopting low-maintenance, high-utility services. Generally, we adopt websites that would have become defunct and run them as services.

Even though IANA says example.com is intended for documentation purposes and not as a service, I feel that it nonetheless serves as a service to the broader internet. I think there are some cornerstone services on the internet, regardless of the maintainers' intentions or their legal definitions.

For example, we ourselves sometimes have to recognize that we are not a standard API service. Considering that we expect to process 3 trillion requests this year, a major outage could take down a good chunk of IT systems everywhere. So, we invested in infrastructure to avoid outages. We then started adopting other cornerstone services and running them indefinitely because we might as well support the users who depend on them because we have infrastructure to support them and us.

I think what you describe is exactly right, it has organically become a service and it is maintained with that in mind. That doesn't mean you shouldn't be clear about what its for and what should be avoided. Otherwise it is setting up an implicit contract that it will service those needs without limitation which turns it into an even bigger dependency.
Not to mention indefinitely. Any decommission, even decades in the future, will be messy. Or imagine if ipinfo got bought up by private equity and they turned off the free service, or maybe attached some sort of agent-pay token to the response[0] so that they collect revenue from running it when possible.

0: https://blog.cloudflare.com/monetization-gateway-beta/

Example.com is one of the sites I visit most often for troubleshooting my connection.
neverssl.com is slightly better for that, since it resists caching.
For a moment I thought you were saying ipinfo runs example.com.

Instead it just seems to be an advert for ipinfo on a post about example.com?

Not an advert. I wish we ran example.com. However, we run a few other services.

The issue with example.com is this statement:

> This domain is for use in documentation examples without needing permission. This is not a service; avoid relying on it for testing and monitoring purposes.

The problem is that, disclaimer or not, if a website provides a useful utility, people will use it as a service.

If example.com breaks, IANA can reasonably say it was never intended to be stable. But that does not change the fact that people will use it for testing and monitoring.

What we do is adopt legacy services whose maintainers can no longer afford, want, or have the resources to maintain them, and invest in keeping them running reliably.

My question was rhetorical ;)
The page mentions example.com 14 times and not a single one is a link
Outrageous. How will people ever find it?!
By typing it or copy+pasting it, which is much more time consuming and much less convenient.

(I actually tried the select, share [sic], open in browser route, but for some reason I only saw opera as an option, not chrome, the browser I actually use for everything. Links still rule.)

For me, it's double click and cmd-U which launches the Search with Google service on macOS.
You also failed to make it a link. In order to automatically create links, you should use the format https://example.com/ with scheme included.
Guess I am part of the problem. Thank you for the link kind stranger.
That’s because they are in code blocks. Oh I hate people who abuse code blocks for things that aren’t code. Domain names are not code. Your browser doesn’t display URLs in a monospace coding font. Stop this abuse.
Static test is still, IMHO best, but if they want that fancy transition they could at least have used a gif. All that js is terrible overkill.
Overkill for a web of humans loading sites in browsers. Not overkill for a dead internet with swarms of agents DDoSing everything in sight.
The language translation animation only lasted a few days. Now it’s static with English at the top and translations below.
It's English at the top for you. The top language depends on your browser settings afaik.
You understand that the GIF would be larger than the JS, right? (Apart from other problems with this idea.)
I'm wondering how many automated tests this change broke.

Yes, I know it's not the example.com's fault, and it's a side effect of Hyrum's Law:

> This is not a service, avoid relying on it for testing and monitoring purposes.

Don't we all have a few fragile tests?

that's a really good point I'd not considered but if you just hash the response and the followups remain consistent (they do in this case)... you're gonna do just fine.
If 1.1.1.1 ever stops responding to pings…
> 1.1.1.1

Pinging such an address is inherently a troublesome practice. This address, like many public DNS servers (resolvers as well as root and authoritative ones), uses "anycast" routing methodology.

https://en.wikipedia.org/wiki/Anycast

Pinging an anycast address will yield a cornucopia of different results. Of course, people who naïvely "ping" a recognizable or easy-to-type IPv4 address get what they deserve, especially when they enshrine it into software, unit tests, or the LLM coughs up such tokens on their behalf.

Fundamentally, the question is "what do you really want to test?" by pinging a particular IPv4? Do you want to test Layer 3 connectivity? Test your ISP's backbone and connectivity? Test only your upstream router? Test the existence of ICMP in your stack and theirs?

... the possibilities are endless. Your router can do anything. Ping zombo.com.

I ping 1.1.1.1 to see if my internet is working or not after a couple of websites don’t load. I reboot the router. I keep the terminal where I’m pinging 1.1.1.1 open until I start seeing responses and then I know my internet is back. Then I continue my web browsing and other online activities.
…and it rules out DNS problems.
I’m so lazy I just type `ping 1.1` and it still works (apparently 1.0.0.1 is also always up).
It's much faster just pinging 127.0.0.1 for such purposes. Try it!
(comment deleted)
In the spirit of M4v3R's post, that should be 127.1 . (-:
Why is pinging an anycast address an issue? Most people, myself included, ping addresses like 1.1.1.1 to check for internet connectivity. It's a perfectly valid check, you don't need a fine grained test all the time. If it fails, then I go looking in detail. Most of the time it will pass.

Pinging a domain name could fail for a variety of other reasons, particularly if it's not a reliable site. Cloudflare's business is being reliable; few sites would be a better choice.

The problem is pinging 1.1.1.1 can end up hitting a really really close-by server. You could be having ISP issues and 1.1.1.1 could end up being closer to you than the issue is, so you get okay ping results but still unable to access resources on the other side of the issue
You can have routing issues that alow some IP addresses to work and others not, anycast or not. It's not supposed to be a comprehensive connectivity report, just a sanity check that the intertubes are connected at all.
You're thinking far too hard. If I can ping 1.1.1.1, it means traffic is flowing from inside my network, to outside my network. I'm not going to diagnose my ISP's issues, that's their job, I just need to know that it's not my problem.
Of course. Ping 1.1.1.1 is not a test that everything is working great. DNS could be dead. IPv6 could be black holed.

But it’s a good “is traffic making it past my router with some semblance of connectivity” sanity check, and easier than finding the provider-side next hop address.

The corollary is that when it fails, you've no idea what failed, because you're abusing a service that isn't designed for you and isn't fit for use. So if it succeeds, you really don't know, because perhaps your train's WiFi router is responding with a spoofed IPv4 address while it goes through the Chunnel. And if it fails, you really don't know, because you DGAF about learning formal troubleshooting methods and couldn't be arsed to find out your upstream router's address in order to simply isolate your PING to a singular link, rather than relying on complex routing rules, especially those introduced by "anycast". And perhaps you can manually dig in when your manual checks fail, but your AI agent or automated script DGAF about your nuanced knowledge that 1.1.1.1 isn't your upstream router; in fact it's not yours at all and has nothing to do with your network setup. But at least it looks elegant.
Is there any single ping test that correctly diagnoses all of the possible issues you raise?
Fun fact, ping is the standard windows way to wait a given number of seconds[0]. You're supposed to ping 127.0.0.1, but I saw a lot of scripts pinging 1.1.1.1 or 8.8.8.8

[0]: https://stackoverflow.com/questions/1672338/how-to-sleep-for...

>Of course, people who naïvely "ping" a recognizable or easy-to-type IPv4 address get what they deserve

Look what happened because of what you did, what it led to! Two microservices are in critical condition and you're laughing. You're laughing.

Any IP address could one day change where it is being announced from, or become anycast, or change the number of hops between you and it.

I don't think people are using `ping 1.1.1.1` as a stable API, rather as a yes/no test of the network segment that they control.

I don’t use this one, because I remember when long, long ago it was in some random IP address block belonging to someone, and this particular address didn’t reply to ping.

Likely for good reason, even back then there would have bound to be lots of misconfigured endpoints trying to access 1.1.1.1, so just blocking it at the earliest point possible kept at lot of the annoyance away. Nowadays, it’s an anycast address, so it’s slightly less bad.

But for me, old habits die hard.

I've already seen a couple of train hotspots respond locally to pings directed at 1.1.1.1 and 8.8.8.8, apparently in effort to convince devices that they are on a good network event if the internet itself is broken due to being in the tunnel.
… then you'll be back in the world before CloudFlare set up its public DNS service, which is also the world where taking over 1.1.1.1 in the first place came at the price of having to measure how many people had ignorantly or lazily put four ones into somewhere that they had to fill in an IP address, and how much bogus and positively risky (to them) traffic there was being caused by people just thinking 'I will just use 1.1.1.1, which is not a real IP address.'.

Just before COVID, a random unidentifiable person reported that 1.1.1.1 saw 60Mb/s of ICMP echo traffic. When APNIC first experimented with making it a valid network almost a decade before that, it was being sent 50Mb/s of general IP traffic. Amusingly, a side-effect of what CloudFlare has done is that it has stopped all of that traffic leaving the edges of the Internet, and funnelling in to one big central place.

There are those who remember the risks of 'just use 1.1.1.1' and how the people who did that used be characterized as 'bad Internet citizens'. The ServerFault answer (q.v.) is from 2011.

* https://labs.ripe.net/author/franz/pollution-in-18/

* https://news.ycombinator.com/item?id=19335833

* https://serverfault.com/a/339782

That was part of Cloudflare's pitch to take over the 1.1.1.1 address block - that Cloudflare had the relatively unique ability to handle all the junk traffic as anycast nearby to any source, not overloading the wider internet.
That's an excellent reason to change the page design occasionally, so that people learn not to rely on it (the hard way if necessary).
Go a step further and randomize it. Different page at every request.
But then people will rely on the randomness to pick their quicksort pivots or something like that.
Maybe, but in any case far fewer than will rely on a fixed page. I think very clearly it'd be a net-pain lowering move for example.com to randomize the results a bit, if they felt like it.
~~I feel like that would probably meaningfully increase the amount of compute necessary to serve the website. As it were it’s likely static html, but any randomness would have to rely on a server side operation for each request and couldn’t be cached.~~

I went and checked and in fact it is already serving a script s.js so I guess you’re right!

There's an xkcd (1172) for that.
Ive been using example1.com recently for availability type testing for what its worth.
IANA, a natural monopoly, can't even host simple html page is kinda funny.
the copy on example.com looks llm-generated now...
Really funny coincidence, I noticed amazon wasn't loading a couple hours ago. Thought it was my internet so went to example.com to check and noticed the redesign. Figured it was a while ago though.
(comment deleted)
I just don't understand why the operator, IANA, has to use Cloudflare for example.com

It cannot manage a one page website. WTF

iana.org forwards to Cloudflare, too

Fortunately the FTP server service still works

Without assistance from a third party

Same reason everyone else uses CF. Static page CDN only became too cheap to meter ~16 years ago, but if CF was around in the 90s IANA would have used it in the 90s too
Cloudflare is the latest in a number of different CDN providers we've used to serve this over many years. I guess the question is, why is it important not to use a CDN?
HN is currently anti Cloudflare. The only thing worse probably would’ve been to serve the static files on GitHub.io
If it's a name in com/net/org only meant for documentation then why serve a page there for decades. If traffic is a problem then take it offline

Years ago IANA started requiring a user-agent header

FTP access to root.zone remains

NB. IANA isn't responsible for "root servers"

It's only responsible for root.zone, root.hints, .arpa and .int zones

[delayed]
It's quite sad to see incompetence at these levels. This is a static page that loads JS. They even inject styles via JS...
It’s not incompetence they are intentionally doing as much as possible via javascript to reduce their bandwidth costs. This is because most access to the domain is automated (not using a browser, using curl etc) and doesn’t load javascript
They use Cloudflare, which does not charge for bandwidth.
For free users. But cloudflare picks and chooses its free users.
It's been about 10 years since I last saw this site and accidentally visited it a few days ago and thought "I don't remember it looking like this"
[delayed]
I believe your use is what they're trying to discourage.

example.com is meant to be legally allowed to be used in text such as "You visit a website (example.com) to browse the internet"

It is not meant to be queried by automated tests or used as a service.

> It's meant to be small [...], even if [...] it's not meant to be used that way

It is not, in fact, _meant_ to be used that way.

> and was wondering why I saw a giant blob of dynamic nonsense instead of a small bit of markup.

It's 4.5x the size of the original. Which sounds bad, until you notice this means it's 2540 bytes and serves the explanatory text in 6x the number of languages. And it's now served with brotli compression, for a total of 1713 bytes. Or 334 bytes if you only request the HTML (which still has a usable page with the full English version of the explanatory text), like a basic scraper or a health check would. So for the vast majority of traffic, it's now half the size of the old version.

This is mine now! <link rel=icon href=data:,>
I put this on all my websites that don’t have a favicon. I hate the default browser behavior of making a request to /favicon.ico without being asked.