O'Reilly

Fixing IIS & PHP Variables – Set $_SERVER[‘REQUEST_URI’] Yourself

By on  

About 8 months into my programming career I needed to code a content management system (CMS). This was quite a challenge so early into my professional journey but I was up to it. The front-end was the easiest part of the project -- a lot quick SQL queries for bringing intros and conclusions to pages that needed to be static due to PHP programming, a sub-navigation builder (the menu was stored in the DB), and the usual take-forever forms.

The most time-consuming part of the project was creating an administrative panel. The administrative panel needed to be highly flexible and portable so that it could be used on other projects. In the end, the framework for the administrative panel has been perfect for all projects since that one. We keep adding modules which save time and allow time for more front-end programming.

With that particular project, however, we ran into a problem that we didn't foresee. -- the customer informed us that we needed to host the website on an IIS server. This was not great news but we knew that IIS would support PHP so we didn't panic. The big problem I ran into is that IIS does not support PHP's $_SERVER['REQUEST_URI'] variable and worse is that I didn't know this until it was time to launch.

I used the $_SERVER['REQUEST_URI'] all over the administration panel. Every "page" of the website ran through the index.php to give me MVC funtionality. Doing so made me need to use the self-referencing $_SERVER['REQUEST_URI'] variable because it provided me the all-important querystring variables I needed to keep my place in the file.

How'd I fix the problem? It was actually quite simple:

if (!isset($_SERVER['REQUEST_URI']))
{
       $_SERVER['REQUEST_URI'] = substr($_SERVER['PHP_SELF'],1 );
       if (isset($_SERVER['QUERY_STRING'])) { $_SERVER['REQUEST_URI'].='?'.$_SERVER['QUERY_STRING']; }
}

This probably seems easy and obvious to most but at the time I was quite new. Hopefully this can help someone save a lot of time!

Track.js Error Reporting

Upcoming Events

Recent Features

  • fetch API

    One of the worst kept secrets about AJAX on the web is that the underlying API for it, XMLHttpRequest, wasn't really made for what we've been using it for.  We've done well to create elegant APIs around XHR but we know we can do better.  Our effort to...

  • Animating CSS3 Transforms with MooTools Fx

    I recently posted an awesome (if I may say so myself) CSS3 / MooTools tutorials called Create a Photo Stack Effect with Pure CSS Animations or MooTools.  The post presented two ways, a pure CSS method or MooTools-powered class, to duplicate Google+'s elegant photo stack...

Incredible Demos

  • Image Data URIs with PHP

    If you troll page markup like me, you've no doubt seen the use of data URI's within image src attributes. Instead of providing a traditional address to the image, the image file data is base64-encoded and stuffed within the src attribute. Doing so saves...

  • Create Snook-Style Navigation Using MooTools

    Jonathan Snook debuted a great tutorial last September detailing how you can use an image and a few jQuery techniques to create a slick mouseover effect. I revisited his article and ported its two most impressive effects to MooTools. The Images These are the same...

Discussion

  1. sometimes web server set a querystring but is empty so I suggest to modify the code like this:

    if (!isset($_SERVER['REQUEST_URI']))  {
    
            $_SERVER['REQUEST_URI'] = substr($_SERVER['PHP_SELF'],1 );
    
            if (isset($_SERVER['QUERY_STRING']) AND $_SERVER['QUERY_STRING'] != "") {
            	$_SERVER['REQUEST_URI'] .= '?'.$_SERVER['QUERY_STRING'];
            }
    }
  2. Dmitry-Sh

    Thank you, it works.

  3. Thanks – it saved me a bundle of time.
    BTW, I changed line 3 to

           $_SERVER['REQUEST_URI'] = substr($_SERVER['PHP_SELF'],0 );
    

    That way the leading “/” wasn’t dropped out.

    David IB

  4. Elias

    Thank you, the article matched exactly what i passed through (modular cms control panel, client with iis, etc), and you provided the perfect solution to the problem, thank you again.

  5. xopi

    Hello,

    I still having Problems, because i use Ionic Sapi Rewriter, and i need to get the rewritten URIs but PHP_SELF has the original URI…

    so you have any solution?

    greetz!

  6. Justin

    Thank you, sir! This fixed me up with a concrete5 project that my client has hosted on IIS.

  7. Shuvo

    Thanks a lot, it really works like magic :)

  8. Thank you! i need to assign this value to a variable. when i use this code:

    $addition1 = if(!isset($_SERVER['REQUEST_URI']))
    {
           $_SERVER['REQUEST_URI'] = substr($_SERVER['PHP_SELF'],1 );
           if (isset($_SERVER['QUERY_STRING'])) { $_SERVER['REQUEST_URI'].='?'.$_SERVER['QUERY_STRING']; }
    }
    

    i get an error: unexpected if statement…………

    any help is much appreciated.

  9. Ankit Tayal

    Thanks a lot .Great Work.saved a lot f time….I really very thankful to u for the same.

  10. Amit

    Hi,

    Thanks for that information.I am a .net developer and new to php development. I faced lot of problem for the same issue until I browse to this site.
    Problem solved.

    Thanks a million

  11. Rob

    Thank you very much – I was having issues with timthumb.php in WordPress, which needed to be installed on a server running IIS. This saved me a lot of trouble.

    • @Rob – where/what changes did you make exactly in timthumb.php?

  12. Thank You for taking the time to share this solution with us. It’s greatly appreciated. I’m having headaches with the IIS all the time and this time you saved me a lot of time.

    Cheers,
    Daniel

  13. Great post! I have been stopped by this problem for a few days.

  14. Thanks for that solution with IIS,
    but in which file do put this piece of code ?
    That should be a common file, called by any other files ?
    thanks for answer.

  15. ima

    Thanks , this helped me to get rid of yii error on iis6

Wrap your code in <pre class="{language}"></pre> tags, link to a GitHub gist, JSFiddle fiddle, or CodePen pen to embed!

Recently on David Walsh Blog

  • Get Node.js Command Line Arguments with yargs

    Using command line arguments within Node.js apps is par for the course, especially when you're like me and you use JavaScript to code tasks (instead of bash scripts).  Node.js provides process.argv but that doesn't provide a key: value object like you'd expect: Bleh.  If you want to work with a...

  • OâReilly Velocity Conference â New York

    My favorite front-end conference has always been O'Reilly's Velocity Conference because the conference series has focused on one of the most undervalued parts of client side coding:  speed.  So often we're so excited that our JavaScript works that we forget that speed, efficiency, and performance are just as important. The next Velocity...

  • Free Download: Font Bundle Featuring 17 Incredible Typefaces

    The only thing we love more than a good font, is a good free font. So we’ve combed the Web for some of our favorite free fonts, and gathered them here in a single download. You’ll find a variety of useful typefaces, from highly geometric designs...

  • OâReilly Velocity Conference â Amsterdam

    My favorite front-end conference has always been O'Reilly's Velocity Conference because the conference series has focused on one of the most undervalued parts of client side coding:  speed.  So often we're so excited that our JavaScript works that we forget that speed, efficiency, and performance are just as important. The next Velocity...

  • CanIUse Command Line

    Every front-end developer should be well acquainted with CanIUse, the website that lets you view browser support for browser features.  When people criticize my blog posts for not detailing browser support for features within the post, I tell them to check CanIUse:  always up to date, unlike...