There is a simple way to get request headers from Apache even on PHP running as a CGI. As far as I know, it's the only way to get the headers "If-Modified-Since" and "If-None-Match" when apache_request_headers() isn't available. You need mod_rewrite, which most web hosts seem to have enabled. Put this in an .htacess file in your web root:
RewriteEngine on
RewriteRule .* - [E=HTTP_IF_MODIFIED_SINCE:%{HTTP:If-Modified-Since}]
RewriteRule .* - [E=HTTP_IF_NONE_MATCH:%{HTTP:If-None-Match}]
The headers are then available in PHP as
<?php
$_SERVER['HTTP_IF_MODIFIED_SINCE'];
$_SERVER['HTTP_IF_NONE_MATCH'];
?>
I've tested this on PHP/5.1.6, on both Apache/2.2.3/Win32 and Apache/2.0.54/Unix, and it works perfectly.
Note: if you use RewriteRules already for clean URLs, you need to put the above rules AFTER your existing ones.
apache_request_headers
(PHP 4 >= 4.3.0, PHP 5)
apache_request_headers — Liefert alle HTTP-Requestheader
Beschreibung
Liefert alle HTTP-Requestheader von der aktuellen Anfrage.
Rückgabewerte
Ein assoziatives Array aller HTTP-Header der aktuellen Anfrage, im Fehlerfall
wird FALSE zurückgegeben.
Changelog
| Version | Beschreibung |
|---|---|
| 5.4.0 | Diese Funktion wurde unter FastCGI verfügbar. Vorher wurde sie nur unterstützt, wenn PHP als Apache Modul installiert war. |
| 4.3.3 |
Ab PHP 4.3.3 können Sie diese Funktion auch mit dem NSAPI-Server-Modul für Netscape/iPlanet/SunONE-Webserver nutzen. |
Beispiele
Beispiel #1 apache_request_headers()-Beispiel
<?php
$headers = apache_request_headers();
foreach ($headers as $header => $value) {
echo "$header: $value <br />\n";
}
?>
Das oben gezeigte Beispiel erzeugt eine ähnliche Ausgabe wie:
Accept: */* Accept-Language: en-us Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 Host: www.example.com Connection: Keep-Alive
Anmerkungen
Hinweis:
Die Werte der gebräuchlichsten CGI-Variablen können Sie auch durch das Auslesen der Umgebungsvariablen erhalten. Dieser Weg funktioniert unabhängig davon, ob Sie PHP als Modul für Apache benutzen. Verwenden Sie phpinfo(), um eine Liste aller zur Verfügung stehenden Umgebungsvariablen zu erhalten.
apache_request_headers
19-Apr-2007 08:07
18-Mar-2007 05:03
I wrote a function similar to jrabbit's, except that mine creates a custom function rather than redefining the original.
<?php
function request_headers()
{
if(function_exists("apache_request_headers")) // If apache_request_headers() exists...
{
if($headers = apache_request_headers()) // And works...
{
return $headers; // Use it
}
}
$headers = array();
foreach(array_keys($_SERVER) as $skey)
{
if(substr($skey, 0, 5) == "HTTP_")
{
$headername = str_replace(" ", "-", ucwords(strtolower(str_replace("_", " ", substr($skey, 0, 5)))));
$headers[$headername] = $_SERVER[$skey];
}
}
return $headers;
}
?>
Also, eval() is not necessary to define a function that is within an if block, as is done in jrabbit's code, because PHP will only read the function if it passes the if condition.
18-Feb-2007 05:01
The PHP developers should not be creating functions like this that only work in the module version and not in the CGI version. It creates situations where people who have setup special installations of PHP (like suphp) run into issues with prewritten software. If you can't make it work with both, then don't make it work at all.
21-Jan-2007 02:04
The following code will implement an approximation of apache_request_headers for lighttpd making most scripts that use the function portable between the two platforms.
Caveats are:
1. This function will convert any _ in a header key to a -
2. This function will capitalize the first character and first character after each hyphen in each header key and lower case the rest of the key.
This does not cause a problem with standard headers which are capitalized in this manner but may cause custom headers to appear in a different case to apache.
if (!function_exists('apache_request_headers')) {
eval('
function apache_request_headers() {
foreach($_SERVER as $key=>$value) {
if (substr($key,0,5)=="HTTP_") {
$key=str_replace(" ","-",ucwords(strtolower(str_replace("_"," ",substr($key,5)))));
$out[$key]=$value;
}
}
return $out;
}
');
}
29-Oct-2006 06:01
I didn't found a replacement for apache_request_headers() in PHP::Compat (http://pear.php.net/package/PHP_Compat) so I wrote my own:
<?php
if( !function_exists('apache_request_headers') ) {
///
function apache_request_headers() {
$arh = array();
$rx_http = '/\AHTTP_/';
foreach($_SERVER as $key => $val) {
if( preg_match($rx_http, $key) ) {
$arh_key = preg_replace($rx_http, '', $key);
$rx_matches = array();
// do some nasty string manipulations to restore the original letter case
// this should work in most cases
$rx_matches = explode('_', $arh_key);
if( count($rx_matches) > 0 and strlen($arh_key) > 2 ) {
foreach($rx_matches as $ak_key => $ak_val) $rx_matches[$ak_key] = ucfirst($ak_val);
$arh_key = implode('-', $rx_matches);
}
$arh[$arh_key] = $val;
}
}
return( $arh );
}
///
}
///
?>
09-Sep-2005 01:00
Surly this could be rewritten as
function list_dirs($path, $target)
{
$list = scandir($path);
$url = $_SERVER['HTTP_HOST'];
foreach ($list as $number => $filename)
{
if ( $filename !== '.' && $filename !== '..' && !is_file($filename) )
{
if ($target == '')
{
// Print Dirs with link
print ("<a href=\"http://$url/$filename\">$filename</a> <br>\n");
}
else
{
// Print Dirs with link
print ("<a href=\"http://$url/$filename\" target=\"$target\">$filename</a> <br>\n");
}
}
}
}
which would then not require apache. I havent tested this but looks to do exactly the same.
21-Apr-2005 07:50
Here is a simple listing function. It accepts a path and target. Examples listed bellow
function list_dirs($path, $target)
{
$list = scandir($path);
foreach ($list as $number => $filename)
{
if ( $filename !== '.' && $filename !== '..' && !is_file($filename) )
{
// Asign more readable and logic variables
$dir = $filename;
$url = apache_request_headers();
if ($target == '')
{
// Print Dirs with link
print ("<a href=\"http://$url[Host]/$dir\">$dir</a> <br>\n");
}
else
{
// Print Dirs with link
print ("<a href=\"http://$url[Host]/$dir\" target=\"$target\">$dir</a> <br>\n");
}
}
}
}
Examples:
1.- List actual dir with no target option
<?php
list_dirs('.', '');
?>
2.- List "mydir" with a "_blank" as target name
<?php
list_dirs('/home/renich/www/mydir', '_blank')
?>
Notes:
- Its a simple function and it uses a function that interacts with apache. I don't know what will happen if you request a file list of a directory outside of the apache realm!
- Not fully tested!