Discussion Community

IT Acumens Forum => Programming Discussions for Engineers => Web Services in PHP => Topic started by: sukishan on Aug 23, 2009, 12:48 AM

Title: A Typical Case - mod_rewrite: No More Endless Loops!
Post by: sukishan on Aug 23, 2009, 12:48 AM
A Typical Case
Let's start with an example.

We want to redirect all URIs to a PHP script. The redirection will be internal, so the client, for example, a browser, will not see that a redirection has occurred. To do this, we create in the document root an .htaccess file that contains these rules:

# Enable rewrite engine
Options +FollowSymLinks
RewriteEngine On

# Redirect internally all URIs to /index.php
RewriteRule .* /index.php [L]

However, this will not work - it'll freeze your Apache Web server. Why?

The problem is this line:

RewriteRule .* /index.php [L]

Simply put, that rule 'says' "Redirect all requests to /index.php.". That may sound like what we originally set out to achieve, but, in practice, we will not get the results we expect.

The following is what happens with a request for www.example.net/path/to/ (http://www.example.net/path/to/):

Phase A

The URI is /path/to/
RewriteRule will rewrite the URI from path/to/ to /index.php
An internal redirection will be made for /index.php
The internal redirection will be treated as a new request, so it will be parsed again (see phase b)

Phase B

The previous internal redirection, /index.php, will be processed again by the rewrite engine
RewriteRule will rewrite index.php to /index.php
An internal redirection will be made for /index.php

At this point the rewrite engine will run Phase B continuously and the Apache Web server will freeze.