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!

Treehouse Learning

Recent Features

  • Create a Sheen Logo Effect with CSS

    I was inspired when I first saw Addy Osmani's original ShineTime blog post.  The hover sheen effect is simple but awesome.  When I started my blog redesign, I really wanted to use a sheen effect with my logo.  Using two HTML elements and...

  • LightFace:  Facebook Lightbox for MooTools

    One of the web components I've always loved has been Facebook's modal dialog.  This "lightbox" isn't like others:  no dark overlay, no obnoxious animating to size, and it doesn't try to do "too much."  With Facebook's dialog in mind, I've created LightFace:  a Facebook lightbox...

Incredible Demos

  • RealTime Stock Quotes with MooTools Request.Stocks and YQL

    It goes without saying but MooTools' inheritance pattern allows for creation of small, simple classes that possess immense power.  One example of that power is a class that inherits from Request, Request.JSON, and Request.JSONP:  Request.Stocks.  Created by Enrique Erne, this great MooTools class acts as...

  • Create Twitter-Style Dropdowns Using MooTools

    Twitter does some great stuff with JavaScript. What I really appreciate about what they do is that there aren't any epic JS functionalities -- they're all simple touches. One of those simple touches is the "Login" dropdown on their homepage. I've taken...

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.

  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!