PHP has a feature that allows you to pre-pend a file at every PHP request. This prepend file is the equivalent of having it include()ed at the top of every single PHP script on your site. It’s is done through a directive that is set either in php.ini or .htaccess. The directive is called auto_prepend_file. It’s also evil if you don’t know about its existence.
In a .htaccess file, you can use this directive to define a specific file that will be auto-prepended, in a directory:
php_value auto_prepend_file "/htaccess_bom_and_php_auto_prepend_adventures/prepend.html"
You can also use this directive to deactivate auto-prepending in a directory or root:
php_value auto_prepend_file none
Note: Use the special value “none“, as explained in the documentation of auto_prepend_file:
The special value none disables auto-prepending.
Note: You can set php_values in .htaccess only where PHP is run as an Apache module.
When I first encountered this issue, I blamed my text editor for byte order marks (BOM). So, I found a neat script that searches for BOM files inside your root and recursively throughout the folders:
<?php
error_reporting(E_ALL);
// Detect BOM sequence in a folder recursively
define('STR_BOM', "\xEF\xBB\xBF");
$file = null;
$directory = getcwd();
$rit = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory), RecursiveIteratorIterator::CHILD_FIRST);
try {
foreach ($rit as $file) {
if ($file->isFile()) {
$path_parts = pathinfo($file->getRealPath());
if ('php' == $path_parts['extension']) {
$object = new SplFileObject($file->getRealPath());
if (false !== strpos($object->getCurrentLine(), STR_BOM)) {
print $file->getRealPath()."\n";
}
}
}
}
} catch (Exception $e) {
die ('Exception caught: '. $e->getMessage());
}
?>
This piece of code is going into my upcoming plugin, WP Perfect Plugin. Heh, that’s a spoiler!


Loading...