mod_rewrite server-variables full list

Official mod_rewrite documentation is not very detailed about server-variables values which is usually used in RewriteCond rules. There is an easy way to get a list of server-variables values by exporting server variables into environment variables and than printing them by your web script, PHP works well :)


Here is .htaccess I have used for exporting variables.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
RewriteEngine On
 
# special mod_rewrite variables
RewriteRule .* - [E=MR_SPECIALS_API_VERSION:%{API_VERSION},NE]
RewriteRule .* - [E=MR_SPECIALS_THE_REQUEST:%{THE_REQUEST},NE]
RewriteRule .* - [E=MR_SPECIALS_REQUEST_URI:%{REQUEST_URI},NE]
RewriteRule .* - [E=MR_SPECIALS_REQUEST_FILENAME:%{REQUEST_FILENAME},NE]
RewriteRule .* - [E=MR_SPECIALS_IS_SUBREQ:%{IS_SUBREQ},NE]
RewriteRule .* - [E=MR_SPECIALS_HTTPS:%{HTTPS},NE]
 
# http headers
RewriteRule .* - [E=MR_HEADERS_HTTP_USER_AGENT:%{HTTP_USER_AGENT},NE]
RewriteRule .* - [E=MR_HEADERS_HTTP_REFERER:%{HTTP_REFERER},NE]
RewriteRule .* - [E=MR_HEADERS_HTTP_COOKIE:%{HTTP_COOKIE},NE]
RewriteRule .* - [E=MR_HEADERS_HTTP_FORWARDED:%{HTTP_FORWARDED},NE]
RewriteRule .* - [E=MR_HEADERS_HTTP_HOST:%{HTTP_HOST},NE]
RewriteRule .* - [E=MR_HEADERS_HTTP_PROXY_CONNECTION:%{HTTP_PROXY_CONNECTION},NE]
RewriteRule .* - [E=MR_HEADERS_HTTP_ACCEPT:%{HTTP_ACCEPT},NE]
 
# connection & request
RewriteRule .* - [E=MR_REQUEST_REMOTE_ADDR:%{REMOTE_ADDR},NE]
RewriteRule .* - [E=MR_REQUEST_REMOTE_HOST:%{REMOTE_HOST},NE]
RewriteRule .* - [E=MR_REQUEST_REMOTE_PORT:%{REMOTE_PORT},NE]
RewriteRule .* - [E=MR_REQUEST_REMOTE_USER:%{REMOTE_USER},NE]
RewriteRule .* - [E=MR_REQUEST_REMOTE_IDENT:%{REMOTE_IDENT},NE]
RewriteRule .* - [E=MR_REQUEST_REQUEST_METHOD:%{REQUEST_METHOD},NE]
RewriteRule .* - [E=MR_REQUEST_SCRIPT_FILENAME:%{SCRIPT_FILENAME},NE]
RewriteRule .* - [E=MR_REQUEST_PATH_INFO:%{PATH_INFO},NE]
RewriteRule .* - [E=MR_REQUEST_QUERY_STRING:%{QUERY_STRING},NE]
RewriteRule .* - [E=MR_REQUEST_AUTH_TYPE:%{AUTH_TYPE},NE]
 
# server internals
RewriteRule .* - [E=MR_SERVER_DOCUMENT_ROOT:%{DOCUMENT_ROOT},NE]
RewriteRule .* - [E=MR_SERVER_SERVER_ADMIN:%{SERVER_ADMIN},NE]
RewriteRule .* - [E=MR_SERVER_SERVER_NAME:%{SERVER_NAME},NE]
RewriteRule .* - [E=MR_SERVER_SERVER_ADDR:%{SERVER_ADDR},NE]
RewriteRule .* - [E=MR_SERVER_SERVER_PORT:%{SERVER_PORT},NE]
RewriteRule .* - [E=MR_SERVER_SERVER_PROTOCOL:%{SERVER_PROTOCOL},NE]
RewriteRule .* - [E=MR_SERVER_SERVER_SOFTWARE:%{SERVER_SOFTWARE},NE]
 
# system stuff
RewriteRule .* - [E=MR_SYSTEM_TIME_YEAR:%{TIME_YEAR},NE]
RewriteRule .* - [E=MR_SYSTEM_TIME_MON:%{TIME_MON},NE]
RewriteRule .* - [E=MR_SYSTEM_TIME_DAY:%{TIME_DAY},NE]
RewriteRule .* - [E=MR_SYSTEM_TIME_HOUR:%{TIME_HOUR},NE]
RewriteRule .* - [E=MR_SYSTEM_TIME_MIN:%{TIME_MIN},NE]
RewriteRule .* - [E=MR_SYSTEM_TIME_SEC:%{TIME_SEC},NE]
RewriteRule .* - [E=MR_SYSTEM_TIME_WDAY:%{TIME_WDAY},NE]
RewriteRule .* - [E=MR_SYSTEM_TIME:%{TIME},NE]

And PHP script for printing our environment variables set by mod_rewrite.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
header('Content-type: text/plain');
 
$types = array(
    'MR_SPECIALS' => 'mod_rewrite specials',
    'MR_HEADERS' => 'HTTP headers',
    'MR_REQUEST' => 'connection & request',
    'MR_SERVER' => 'server internals',
    'MR_SYSTEM' => 'system stuff',
);
 
foreach ($types as $prefix => $title) {
    echo "\n$title\n\n";
    $length = strlen($prefix);
    foreach ($_SERVER as $k => $v) {
        if (!strncmp($prefix, $k, $length)) {
            $name = substr($k, $length + 1);
            echo "\t$name = $v\n";
            unset($_SERVER[$k]);
        }
    }
}

In my case result of this script was:

mod_rewrite specials
 
	API_VERSION = 19990320:18
	HTTPS = 
	IS_SUBREQ = false
	REQUEST_FILENAME = /var/www/localhost/htdocs/rewrite/index.php
	REQUEST_URI = /rewrite/index.php
	THE_REQUEST = GET /rewrite/ HTTP/1.1
 
HTTP headers
 
	HTTP_ACCEPT = text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
	HTTP_COOKIE = __utma=244126489.1603825951.1219764429.1219764429.1219764429.1; __utmz=244126489.1219764429.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)
	HTTP_FORWARDED = 
	HTTP_HOST = localhost
	HTTP_PROXY_CONNECTION = 
	HTTP_REFERER = 
	HTTP_USER_AGENT = Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3
 
connection & request
 
	AUTH_TYPE = 
	PATH_INFO = 
	QUERY_STRING = 
	REMOTE_ADDR = 127.0.0.1
	REMOTE_HOST = 127.0.0.1
	REMOTE_IDENT = 
	REMOTE_PORT = 41363
	REMOTE_USER = 
	REQUEST_METHOD = GET
	SCRIPT_FILENAME = /var/www/localhost/htdocs/rewrite/index.php
 
server internals
 
	DOCUMENT_ROOT = /var/www/localhost/htdocs
	SERVER_ADDR = 212.47.219.48
	SERVER_ADMIN = root@localhost
	SERVER_NAME = localhost
	SERVER_PORT = 80
	SERVER_PROTOCOL = HTTP/1.1
	SERVER_SOFTWARE = Apache/1.3.41 (Unix) PHP/5.3.0-dev mod_macro/1.1.2 mod_chroot/0.5
 
system stuff
 
	TIME = 20081106172629
	TIME_DAY = 06
	TIME_HOUR = 17
	TIME_MIN = 26
	TIME_MON = 11
	TIME_SEC = 29
	TIME_WDAY = 4
	TIME_YEAR = 2008

One Response

  1. Juan

    Very useful for debuggin Rewrite Conditions and Rules.

Leave a Reply