Home > General, Web Development > PHP Proxy Script for cross-domain requests

PHP Proxy Script for cross-domain requests

I wrote this php-proxy-script and have been using for different purpose (loading cross-domain data like text, xml, swf, image, etc. or for YouTube REST API  in flash, flex applications).

Often people keep asking about proxy-scripts in forums, now they can download the code and use :)

Download the proxy.php.txt

Usage:-

http://yourserver.com/proxy.php?url=<url_encoded_desitnation_url>[&mimeType=<mimeType>]

Examples:-

To load XML/Text:
http://yourserver.com/proxy.php?url=http%3A//abdulqabiz.com/blog/index.xml

To load a SWF (binary-data):
http://yourserver.com/proxy.php?url=http%3A//abdulqabiz.com/files/some.swf&mimeType=application/x-shockwave-flash

Technorati tags: , ,

  • Tibin mathew
    // If it's a POST, put the POST data in the body
    if ($_POST['https://newport.ingrammicro.com/mustang']) {
    echo("hai");
    $postvars = "2.014-01811114-018111MDt8772CG4339pW824D7441";
    while ($element = current($_POST)) {
    $postvars .= key($_POST).'='.$element.'&';
    next($_POST);
    }
    curl_setopt ($session, CURLOPT_POST, true);
    curl_setopt ($session, CURLOPT_POSTFIELDS, $postvars);
    }

    here in your code its saying if its a post put the post data in the body, is it the html body of my php page or any thing else, plz say about this, where should i give my xml document to post to the url????
  • Jay

    Thanks for this script.

    It helped me to solve my problem.


    While implementing this, I found out two minor problems and possible solutions
    that I would like to share with you guys:





    1) If current($_POST) is empty (blank), the condition (while) becomes false. The
    subsequent post fields cannot be processed (not included in $postvars).





    while ($element = current($_POST)) {


    $postvars .= key($_POST).'='.$element.'&';


    next($_POST);


    }





    Solution:


    while ($key = key($_POST)) {


    $postvars .= $key.'='.urlencode(current ($_POST)).'&';


    next($_POST);


    }








    2) I think urlencode() should be used as shown below:


    $postvars .= $key.'='.urlencode(current ($_POST)).'&';



    I hope this helps.

  • @Bhaskar: I use both approaches, CURL gives more control over things... I never tried, but can you handle HTTP 30x redirects etc with fopen technique?
    -abdul
  • How about without using curl and relying just on he php fopen. I use this often for tackling any same-origin / cross-domain issues since the fopen can open any remote address ,no strings attached .
    I've briefly talked about it over at demo here .
    Keep Clicking,
    Bhasker V Kode,
    returnable.org
  • Jiten
    Thank you, but.... what do I write on my Action Script (SWF File) aaand what do I write exactly on the proxy.php file ? please, just explain with detail this and I will appreciate, tahnks a lot,
    Sw. Jiten
  • Do I misunderstand anything or does this proxy script also opens up your server to the world to be, possibly, misused for things like hiding one's identity, i.e. the IP? I don't have a good feeling with such a script.
  • I had issues with this script (and others) returning 0 for the bytesTotal in flash. Basically, the Content-Length header was absent from the response. By simply adding
    header("Content-length: ".strlen($response)) before the echo, it resolved the issue. I don't know if there is a more appropriate fix to account for character encoding, etc, but it seems to work.
  • @Schimmi: Well, if you can add some checks there (like who is referring your script) and allow the access to whitelisted clients (served from your domain)... I think, you can totally make it used applications from same-domain....So it would not be open to world. Yeah above script doesn't have those things..
    -abdul
  • @Lanny: Thanks for that, I would update it my code also...I need to find a way to return correct content-length for all content-type (text/binary/gzip etc)...
    Thanks
    -abdul
  • Lucas
    God bless you! I was tearing my hair out. Works like a charm - but you knew that...
  • The PHP proxy script have support of GET and POST solicitations?
    Falopa!
  • WOW! thanks for sharing the script. excellent work
  • AL

    Here is a ASP Proxy Script.




    <!-- Code starts Below this line -->


    <%


    set objHttp = Server.CreateObject("Msxml2.ServerXMLHTTP")


    strURL = Request("url")"


    objHttp.open "GET", strURL, False


    objHttp.Send





    If objHttp.status = 200 Then


        Response.Expires = 90


        Response.ContentType = Request("mimeType")


        Response.BinaryWrite objHttp.responseBody


        set objHttp = Nothing


    End If


    %>


    <!-- Code ends above this line -->





    Usage:





    <a href="http://yourserver.com/proxy.asp?url=<url_encoded_desitnation_url>%5B&mimeType=<mimeType>%5D%3C/br%3E%3Cbr">http://yourserver.com/proxy.asp?url=<url_enc...>



    Example:





    http://yourserver.com/proxy.asp?url=http%3A//ww...>






     

  • Inder
    Thank you very much for this PHP script.... It really solved my big problem. Once again Thanks
  • Nice script gonna try my hand with it...
    regards..
    mohnkhan
    http://www.mohitech.com
  • Will this work with displaying YouTube videos?
  • @Carl: You can use other code available on this blog for YouTube.
    http://www.abdulqabiz.com/blog/archives/general...
    http://www.abdulqabiz.com/blog/archives/flash_a...
    http://www.abdulqabiz.com/blog/archives/flash_a...
    Read the comments on all of above posts, you would fine more details and code.
    -abdul
  • Really tanks for that.
  • sure.. nice code, butt...
    unhappily images are not stored in cache..
  • Eddie
    Hello
    I am using your proxy.php script to grab iGoogle weather in flash. I have php enabled and configured on our IIS 6 server, but nothing loads when going to the page. Do you have any ideas what could be causing this? Thanks
  • CB
    This looks like a simple modification of http://developer.yahoo.com/javascript/samples/p... but with the original author's name conveniently removed (and not retained for giving proper credit???)
  • Anthony
    I have changed the source file to point to the proxy.php file in the same directory, and exported the swf. The swf cannot load the data. If i try to look at the proxy.php file directly, i just get errors. Any suggestions?
  • Alex
    Excuse me, but i need a little help. i want to use your proxy for cross-domain request. i tryed it to make a request from a java Requestbuilder with an xml file as content and an POST as method, but my php isnt good and i cant get the content from the request to use ist in your proxy. some advices?
  • Marissa
    I am using this script for flash and google calendar and it works pretty great. the only problem is that it seems to change the sort order of google calendar. the feed I'm trying to get is https://www.google.com/calendar/feeds/doug%40do... but it defaults to the orderby default.
    Any ideas?
  • Maria
    You should make this able so that people can get on myspace.com from here.
  • Totally brilliant, elegant and simple. Thanks so much for your work on this.
  • Avery
    Fantastic. Absolutly fantastic. Thank you so much for this excellent little file.
    Life saver!
  • jaris
    I have tried the script to access a distant flv file. It works, but I have to wait a lot of time to see the video. Have you an idea to have a progressive download of the file.
  • Hi Guys
    Thanks for feedback.
    @jaris Yeah, this script can do better, if tweaked. I can imaging, for progressive video you would need to have logic so it can buffer the output. Unfortunately, I don't have time right now to add or test that.
    If you figure out the fix, please let me know.
    Thanks
    -abdul
  • jayp
    Thanks!
    I didn't set mime-type and everything but MSIE worked fine. So if MSIE not working, make sure mime type is specified after url.
  • Chris
    Hi I'm trying to use this with Google Calendar and AS3 but its throwing up an IOError. The AS3 causing the problem is:
    var xmlLoader:URLLoader = new URLLoader( new URLRequest('proxy.php?url='+ xmlURL) );
    Any ideas? I have the proxy.php file in the same folder as the swf.
    @Alex: If you're putting the calendar events into an array, you could try sorting that using myArray.sortOn('myProperty', Array.DESCENDING);
  • TELLO
    Hi Abdul,
    i have problem. I use the script to get XML datas from other domain. I use the url urlencoded like your advice. It works in FireFox perfect, but not in IE. I tested IE 6, 7 and 8, but no result.
    You write it works in IE with mime type after URL. So i need XML, what must i put on the end that it works in IE, because i guess it is my problem...
    THANKS
  • petkusj
    Hi Abdul,

    I'm trying to get the proxy to work with this simple Flash example:

    var loader:Loader = new Loader();
    var loadercontext:LoaderContext = new LoaderContext();
    loadercontext.checkPolicyFile = true;
    var urlrequest:URLRequest = new URLRequest("http://www.mydomain.com/scripts/proxy.php");

    var urlvariables:URLVariables = new URLVariables();
    urlvariables.url = escape("http://upload.wikimedia.org/wikipedia/en/3/39/The_Tonight_Show_with_Conan_O'Brien-Intertitle.jpg");
    urlvariables.mimeType = "image/jpeg";

    urlrequest.data = urlvariables;
    urlrequest.method = URLRequestMethod.POST;
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadHandler);
    loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
    loader.load(urlrequest, loadercontext);
    var shape:Shape = new Shape();
    addChild(shape)

    function errorHandler(e:IOErrorEvent):void {
    ExternalInterface.call("window.alert", e.toString());
    }
    function loadHandler(evt:Event):void {
    var bitmapdata:BitmapData = new BitmapData(loader.contentLoaderInfo.width, loader.contentLoaderInfo.height, false);
    bitmapdata.draw(loader);
    shape.graphics.beginBitmapFill(bitmapdata, null, true);
    shape.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
    shape.graphics.endFill();
    }

    with the idea that if I can get this to work, I can get my application to work, but I'm getting an Error #2124, which is telling me that Flash doesn't understand the file type.

    I'd appreciate any help with this. wikimedia doesn't use crossdomain.xml files.

    Thanks, Jennifer
  • @Jennifer, I would need to run your code and see what might be going wrong. Did you use any tool like firebug (extention for Firefox) to see if image is getting downloaded at client side?.
  • petkusj
    Hi Abdul,

    Thanks for responding. I'm afraid I get nothing back from the server. You can see the code above in action at http://www.cuculcan.com/testwikimedia.html. Other than Flash returning the error code, that's it. Firebug error console returns nothing.

    I do know that in the Flash authoring environment I can load that image (without using a proxy) and fill a shape because it doesn't throw a security error. But, of course, I can't do it in the browser. So I do know that nothing is wrong with that image.

    Again, any help would be greatly appreciated. If you go to my website -- http://www.cuculcan.com/ -- you can see how I'm using the background images.

    Thanks,

    Jennifer
  • Alarik
    HI, i had the same problem.
    I tried to load a jpg with the proxy and had the same error 2124.
    The problem, in my case, was that the url I provided to the proxy contained a "space" character (something like: http://www.example.com/Dir One/xx.jpg).
    When the script got the "Dir One" string it did not reencoded so that the requested file was .../Dir One/... instaed of ../Dir%20One/...
    I fixed adding a function in the php script that replaces all the "space" characters with the "%20" string, and now it works.

    bye
  • Mikkel
    Thanks for sharing, just save me.
blog comments powered by Disqus