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!

Recent Features

  • By
    Animated 3D Flipping Menu with CSS

    CSS animations aren't just for basic fades or sliding elements anymore -- CSS animations are capable of much more.  I've showed you how you can create an exploding logo (applied with JavaScript, but all animation is CSS), an animated Photo Stack, a sweet...

  • By
    Creating Scrolling Parallax Effects with CSS

    Introduction For quite a long time now websites with the so called "parallax" effect have been really popular. In case you have not heard of this effect, it basically includes different layers of images that are moving in different directions or with different speed. This leads to a...

Incredible Demos

  • By
    Select Dropdowns, MooTools, and CSS Print

    I know I've harped on this over and over again but it's important to enhance pages for print. You can do some things using simple CSS but today's post features MooTools and jQuery. We'll be taking the options of a SELECT element and generating...

  • By
    Xbox Live Gamer API

    My sharpshooter status aside, I've always been surprised upset that Microsoft has never provided an API for the vast amount of information about users, the games they play, and statistics within the games. Namely, I'd like to publicly shame every n00b I've baptized with my...

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!