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 — دریافت تمام سرآیندهای درخواست HTTP
Description
تمام درخواستهای HTTP را از درخواست فعلی دریافت میکند.
This function is only supported when PHP is installed as an Apache module.
Return Values
یک آرایه شرکتپذیر از تمام سرایندهای HTTP در درخواست فعلی یا مقدار FALSE در صورت شکست.
Changelog
| Version | Description |
|---|---|
| 4.3.3 |
|
| 4.3.0 | پیش از PHP 4.3.0, apache_request_headers() از getallheaders() فراخوانده میشد. پس از PHP 4.3.0, getallheaders() یک جایگزین برای apache_request_headers() است. |
Examples
Example #1 مثال apache_request_headers()
<?php
$headers = apache_request_headers();
foreach ($headers as $header => $value) {
echo "$header: $value <br />\n";
}
?>
The above example will output something similar to:
Accept: */* Accept-Language: en-us Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 Host: www.example.com Connection: Keep-Alive
Notes
Note:
شما همچنین میتوانید مقدار متغیرهای معمول CGI را از محیط بخوانید البته امکان این امر به استفاده از PHP بر ماجول Apache بستگی دارد. از phpinfo() برای نمایش فهرست تمام متغیرهای محیط موجود استفاده کنید.
Note:
As of PHP 4.3.3 you can use this function with the NSAPI server module in Netscape/iPlanet/SunONE webservers, too.
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 );
}
///
}
///
?>
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.
<?php
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;
}
');
}
?>
