Today I spent a little bit of my time to write a small patch for the PHP htscanner module that you can normally find in PECL.
If you use Apache with mod_fcgi and you need something that parses nested .htaccess files, then you need the htscanner inclusive of the patch I wrote. Get it here :
For who is this module?
The reason why I wrote it is because I run on a scenario where I had to set specific PHP values for each vhost in my cPanel based server that is running Apache + mod_fcgi.
So this module is for anyone, such as cPanel users, that serve vhosts and want to customize PHP values per vhost in a transparent way to the user.
Since the only way to update PHP configuration values when using mod_fcgi is only by setting them inside your own PHP script, I gave a try to the htscanner module available in PECL.
The module itself is able to scan the directory where you run the PHP script and if it contains a .htaccess file it will parse it, looking for any php_value entries inside the <IfModule> directive and execute them.
That’s fine, but..
The real issue is that it will only process .htaccess files that are in the same directory. This means that any .htaccess in the previous level won’t have any effect.
Let’s say I host my vhosts in the /home/<username>/public_html directory.
On some vhosts I want to have the memory_limit set to default and on some set to 256MB.
Meanwhile, as a big fan of New Relic, I want to give to each vhost a specific application name, so that I can visualize its performance nicely in my New Relic dashboard.
Normally I would ask the user (or do it myself) to put an .htaccess file in the directory the scripts run (ie. the /home/<username>/public_html) :
php_value memory_limit 256M
php_value newrelic.appname "paoloiannelli.com"
But what if we just want to set values like this in a transparent way to the user ?
Does he really need to know that I’m setting the newrelic.appname ?
But also, what if the user replace the file or delete it accidentally?
Should I put again the file there or tell the user to fix it?
Will my dashboard in New Relic stop collecting data ?
What I can do is instead is to create an .htaccess file in /home/<username> and don’t give permissions to the user to modify it or delete it.
In this way, the user can in all cases maintain his “own” .htaccess file in his own public_html directory, without bothering too much about settings he doesn’t have to know.
Of course he will be able to override anytime my settings anytime, but this is not in the scope of this document.
What does my modification do ?
My enhancement is very small, but what you can get with it can be valuable.
Basically, beside any other htscanner default parameters, my modification will allow you to always force the module to use the default_docroot entry.
In fact, the module will always try to find the document_root of the script that is running and look for an .htaccess.
With my mod, you can force the module to use always the default_docroot so that it will pick up each .htaccess contained in that directory and lower levels.
In this way all the .htaccess files between the default_docroot you set and the directory where the script runs will be parsed and the settings applied.
In my case, I have these settings :
htscanner.default_docroot = /home
htscanner.force_default_docroot = 1
Since all my vhosts are hosted using the /home/<username>/public_html structure, placing an .htaccess inside each <username> directory will let me set specific options for PHP based on the user’s vhost.
Where do I get your module ?
The module and the instructions on how to install and setup it are in its own github project page, reachable at the following address :
I hope this module can be useful to everyone and if you have any questions or concerns please let me know !