.htaccess files, PHP, includes directories, and windows XAMPP configuration nightmare

.htaccess, apache, config, php, xampp

Solution

- Why do you need to rename .htaccess to htaccess.txt

- Try setting the include_path using set_include_path() and see if that helps (as an intermediate fix)

- Verify which php.ini to use through a phpinfo()

Problem

XAMPP makes configuring a local LAMP stack for windows a breeze. So it's quite disappointing that enabling `.htaccess` files is such a nightmare. My problem: I've got a PHP application that requires apache/php to search for an `/includes/` directory contained within the application. To do this, `.htaccess` files must be allowed in Apache and the `.htaccess` file must specify exactly where the includes directory is. Problem is, I can't get my Apache config to view these `.htaccess` files. I had major hassles installing this app at uni and getting the admins there to help with the setup. This shouldn't be so hard but for some reason I just can't get Apache to play nice. This is my setup: `c:\xampp` `c:\xampp\htdocs` `c:\xampp\apache\conf\httpd.conf` - where I've made the changes listed below `c:\xampp\apache\bin\php.ini` - where changes to this file affect the PHP installation It is interesting to note that `c:\xampp\php\php.ini` changes mean nothing - this is NOT the ini that affects the PHP installation. The following lines are additions I've made to the `httpd.conf` file ``` #AccessFileName .htaccess AccessFileName htaccess.txt # # The following lines prevent .htaccess and .htpasswd # files from being viewed by Web clients. # #<Files ~ "^\.ht"> <Files ~ "^htaccess\."> Order allow,deny Deny from all </Files> <Directory "c:/xampp/htdocs"> # # AllowOverride controls what directives may be placed in # .htaccess files. # It can be "All", "None", or any combination of the keywords: # Options FileInfo AuthConfig Limit # AllowOverride All # # Controls who can get stuff from this server. # Order allow,deny Allow from all </Directory> ``` The following is the entire `.htaccess` file contained in: `c:\xampp\htdocs\application\htaccess.txt` ``` <Files ~ "\.inc$"> Order deny,allow Deny from all </Files> php_value default_charset "UTF-8" php_value include_path ".;c:\xampp\htdocs\application\includes" php_value register_globals 0 php_value magic_quotes_gpc 0 php_value magic_quotes_runtime 0 php_value magic_quotes_sybase 0 php_value session.use_cookies 1 php_value session.use_only_cookies 0 php_value session.use_trans_sid 1 php_value session.gc_maxlifetime 3600 php_value arg_separator.output "&amp;" php_value url_rewriter.tags "a=href,area=href,frame=src,input=src,fieldset=" ``` The includes directory exists at the location specified. When I try to access the application I receive the following error: ``` Warning: require(include.general.inc) [function.require]: failed to open stream: No such file or directory in C:\xampp\htdocs\application\menu\logon.php on line 21 ``` Fatal error: require() [function.require]: Failed opening required `include.general.inc` (include_path='.;C:\xampp\php\pear\random') in `C:\xampp\htdocs\application\menu\logon.php` on line 21 The include path `c..\random\` is specified in the `php.ini` file listed above. The XAMPP install fails to allow another include path as specified in the `htaccess.txt` file. I'm guessing there's probably an error with the `httpd.conf` OR the `htaccess.txt` file.. but it doesn't seem to be reading the `.htaccess` file. I've tried to be as thorough as possible so forgive the verbosity of the post. Now I know a workaround could be to simply add the include_path to the PHP file, but I'm not going to have access to the `php.ini` file on the location I plan to deploy my app. I will, however, be able to request the server admin allows `.htaccess` files. renamed `htacces.txt` to `.htaccess` and ammended the appropriate directives in the `httpd.conf` file and all seems to work. The application suggested the naming of `htaccess.txt` and the ammended directives in the httpd. These are obviously wrong (at least for a XAMPP stack). By the way, using ini_set() is a much friendlier way if the app needs to be deployed to multiple locations so thanks especially for that pointer.

Original source