I am building a PHP application in CodeIgniter. CodeIgniter sends all requests to the main controller:
index.php. However, I don't like to see
index.php in the URI. For example,
http://www.example.com/faq/whatever will route to
http://www.example.com/index.php/faq/whatever. I need a reliable way for a script to know what it's address is, so it will know what to do with the navigation. I've used
mod_rewrite, as per CodeIgniter documentation.
The rule is as follows:
RewriteEngine on RewriteCond $1 !^(images|inc|favicon\.ico|index\.php|robots\.txt) RewriteRule ^(.*)$ /index.php/$1 [L]
Normally, I would just check
php_self, but in this case it's always
index.php. I can get it from
PATH_INFO, etc., but I'm trying to decide which will be most reliable. Does anyone know (or know where to find) the real difference between
REQUEST_URI? Thanks for your help!
Note: I've had to add spaces, as SO sees the underscore, and makes it italic for some reason.
Updated: Fixed the spaces.
The PHP documentation can tell you the difference:
The filename of the currently executing script, relative to the document root. For instance, $_SERVER['PHP_SELF'] in a script at the address http://example.com/test.php/foo.bar would be /test.php/foo.bar. The __FILE__ constant contains the full path and filename of the current (i.e. included) file. If PHP is running as a command-line processor this variable contains the script name since PHP 4.3.0. Previously it was not available.
Contains the current script's path. This is useful for pages which need to point to themselves. The __FILE__ constant contains the full path and filename of the current (i.e. included) file.
The URI which was given in order to access this page; for instance, '/index.html'.
PATH_INFO doesn't seem to be documented...
Some practical examples of the differences between these variables:
Example 1. PHP_SELF is different from SCRIPT_NAME only when requested url is in form:
[PHP_SELF] => /test.php/foo/bar [SCRIPT_NAME] => /test.php
(this seems to be the only case when PATH_INFO contains sensible information [PATH_INFO] => /foo/bar) Note: this used to be different in some older PHP versions (<= 5.0 ?).
REQUEST_URI is different from SCRIPT_NAME when a non-empty query string is entered:
[SCRIPT_NAME] => /test.php [REQUEST_URI] => /test.php?foo=bar
Example 3. REQUEST_URI is different from SCRIPT_NAME when server-side redirecton is in effect (for example mod_rewrite on apache):
[REQUEST_URI] => /test.php [SCRIPT_NAME] => /test2.php
REQUEST_URI is different from SCRIPT_NAME when handling HTTP errors with scripts.
Using apache directive ErrorDocument 404 /404error.php
[REQUEST_URI] => /test.php [SCRIPT_NAME] => /404error.php
On IIS server using custom error pages
[SCRIPT_NAME] => /404error.php [REQUEST_URI] => /404error.php?404;http://example.com/test.php