in reply to Re: How can I determine whether a URI, hostname or IP address is to the local host machine?
in thread How can I determine whether a URI, hostname or IP address is to the local host machine?

Interesting thought. I don't think it would be wise to send a unique identifier in a cookie or query parameter, because it may be going to an arbitrary site, which might not like receiving an unexpected cookie or query parameter. But it could be sent in a custom HTTP header, since according to the HTTP 1.1 specification, unrecognized headers SHOULD be ignored. However, there would still be the issue of generating a unique identifier -- rand would probably be good enough for that -- and sharing it across all of the mod_perl2 threads that handle HTTP requests for my server, which sounds like it would require some kind of locking or mutex. This approach may be worth considering if I cannot find anything easier.

But it seems to me that there must be some reliable way to do this at the OS level, since the OS obviously needs to know all of the IP addresses and ports on which it is listening.

  • Comment on Re^2: How can I determine whether a URI, hostname or IP address is to the local host machine?
  • Download Code

Replies are listed 'Best First'.
Re^3: How can I determine whether a URI, hostname or IP address is to the local host machine?
by Anonymous Monk on Apr 29, 2014 at 22:33 UTC

    A machine can identify its own IP addresses. However, the mapping of DNS names both to and from IP addresses can actually be pretty complicated to get completely right. Multiple adapters per machine, virtual machines, Apache virtual hosts, load balancers, transparent proxies, multiple addresses per DNS entry, multiple DNS entries per address, ...

    The header only needs to be "unique" to your script so that it can identify its own requests, e.g. X-dbooth-Loop-Prevention: foo. Or you could set a custom User-Agent like tobyink suggested, except that you could check for the presence of this header in your script instead of letting the webserver do it. The only case where this scheme could go wrong is if there is a transparent proxy in the path which modifies or removes headers.

      The custom header idea suggested by Anonymous_Monk (and elaborated slightly differently by tobyink using the User-Agent header) is a pretty good idea, but it does have the downside of requiring an extra HTTP request. And it seems kludgey to do an HTTP request to figure out something that I should be able to determine from my OS. Still, I might try this approach if I cannot find a reasonable way to get the information from the OS.