.htaccess files are often used because they allow quick changes to the apache web server configuration and don't require apache to be restarted. However with this flexibility comes a number of performance implications and as a result they should be avoided unless you have absolutely no other way to put configuration changes into effect e.g: shared hosting where you are unlikely to have access to httpd.conf.
The .htaccess performance hit
If .htaccess files are allowed (through the AllowOverride directive) then apache will look for .htaccess files on every request. In addition apache has to look up the directory tree to see if there are further .htaccess files in locations above the location the file is requested from so that it can tell which directives have precedence. For example: if you request a file from/foo/bar
, apache has to look for /foo/bar/.htaccess
, /foo/.htaccess
and /.htaccess
and that's even if there are no .htaccess files present in any of those locations! Once a .htaccess file is found it has to be parsed and don't forget all of this has to happen for every request!!
As there's nothing in a .htaccess file that can't be achieved in your httpd.conf (or files included by httpd.conf) it makes sense to move existing .htaccess rules into your apache conf using a Directory or Location directive as appropriate.
Restarting apache without dropping users
One other reason why .htaccess are seen as a convenience is that they don't require apache to be restarted after configuration changes. However if you restart apache with "apachectl graceful" you only force the parent process to re-read the apache configuration files and the children to restart when they're not doing anything and as a result no end users are suddenly dropped.Finding all of the .htaccess files on your system
Simply drop on to your terminal and change directory to where you site files are located and run:find . -name *.htaccess -print
. This should provide output that shows the location of all of the .htaccess files so you can go through one by one and move them to into httpd.conf or a file included by httpd.conf.