19
votes

I'm having some weird problems with file_get_contents after moving my site to a new domain. I had to set up a new domain and IP address (using Plesk) to get a new ssl certificate working. Now my file_get_contents calling a script on the same domain is giving me this:

failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found

If I call the same url using file_get_contents on another server it works fine, and if I call www.google.com from the server thats failing that works, so it only seems to be if I call a url on the same sever!

I have a feeling it might have something to do with having two IPs with two different ssl certificates on the one server, when i file_get_contents / (index page) of the server from the server I get the plesk 'this is a new domain' page so its like apache isnt looking up the right virtual host when its called from its own sever.

To clarify (hopefully!):

On the server hosting the domain:

file_get_contents('https://mydomain.com?limit=4&offset=0&s_date=2012-02-05&e_date=2012-03-13&order=release_date&dir=desc&cid=12');

gives "failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found"

file_get_contents('http://www.google.com');

works correctly

On another server:

file_get_contents('https://mydomain.com?limit=4&offset=0&s_date=2012-02-05&e_date=2012-03-13&order=release_date&dir=desc&cid=12');

works fine.

I have tried turning ssl off and I still get the same problem.

4
posting complete code will help you better getting the right answerZaffar Saffee
N e w B e e is right, I'm not sure I understand this.Jack
Can you test echo gethostbyname('mydomain.com'); in your script ? And show us your virtual host conf.soju
Can you issue a ping or some kind of DNS resolve on the server hosting the domain? 404 means that the file cannot be found, it has nothing to do with SSL. Also, do you have access to the webserver's access log? perhaps you will have some clues there. Also, if you try to access the URL from your own browser, what is the result?Yaniro
I have the same problem on a windows legaccy windows serverJonathan dos Santos

4 Answers

6
votes

I've had this problem too, when I working on a little test server at home. The domain name is resolved to your external IP address, and a request is sent. But because the request is coming from inside your network, the router doesn't recognise it as a normal request. It probably has a web interface for configuring it, and tries to return a page from its own management system, which is then not found at the path you specified.

In that case, I was working on a Windows PC, and I could solve it by adding the domain I was testing to my hosts file, specifying 127.0.0.1 as the IP-address (or the IP-address of the server, if it is another machine within the same network). In Linux there should be a similar solution, I think.

The problem isn't PHP or your server, but your router.

5
votes

Most hosting provides now block the furl_open parameter which allows you to use file_get_contents() to load data from an external url.

You can use CURL or a PHP client library like Guzzle

3
votes

If you just need to handle the warning when the URL is not found (as I did), you may just do this to turn Warnings into Exceptions:

set_error_handler(
  function ($err_severity, $err_msg, $err_file, $err_line, array $err_context) {
    // do not throw an exception if the @-operator is used (suppress)
    if (error_reporting() === 0) return false;

    throw new ErrorException( $err_msg, 0, $err_severity, $err_file, $err_line );
  },
  E_WARNING
);
try {
  $contents = file_get_contents($your_url);
} catch (Exception $e) {
  echo $e->getMessage();
}
restore_error_handler();

Solution based on this thread/question.

0
votes

Try to do this :

file_get_contents('https://mydomain.com?'.urlencode('limit=4&offset=0&s_date=2012-02-05&e_date=2012-03-13&order=release_date&dir=desc&cid=12'));