The pertinent part of my .htaccess looks like this:
Options -Indexes
<FilesMatch include>
Order allow,deny
Deny from all
</FilesMatch>
RedirectMatch 404 ^/include(/.*)$
And it's generating the following responses:
- /include 403
- /include/ 404
- /include/config.inc 403
I can tell by looking at my pattern that problem is likely in the (/.*) part but everything I have tried gives me the same results; instead of consistently getting 404 I get a 404 for the one case and 403 for everything else. What is wrong with the expression I'm using? Alternatively since I have to do this for a few directories is there a blanket approach that would allow me to convert all 403 responses to 404?
UPDATE: I've found that by removing the FileMatch I get better results, so my .htaccess now looks like this:
Options -Indexes
RedirectMatch 404 ^/include(/.*)?$ # Added dlamblin's first suggestion
And generates the following responses:
- /include 404
- /include/ 404
- /include/config.inc 403
UPDATE: Interestingly enough I have discovered that the following produces different output:
RedirectMatch 404 ^/include(/?|/.*)$
RedirectMatch 404 ^/template(/?|/.*)$
The template pattern works on all cases however include is still generating 403 for all files in include (e.g. /include/config.inc) Could this be an issue with the directory name and not a problem with the .htaccess file itself?
UPDATE: The following in my .htaccess was conflicting with redirect when accessing /include/config.inc.
<FilesMatch config>
Order allow,deny
Deny from all
</FilesMatch>
I can understand why the /include isn't caught by your RedirectMatch, you aren't making the end '/' optional, however the /include/config.inc part is a bit on the puzzling side.
Here is what I got to work on Apache 2.2:
This handles these cases:
I had to change the FilesMatch part in order for the /include part to work properly.
EDIT:
The match line also works without the <FilesMatch> section in .htaccess and gives the expected results.
Another possibility is not to bother matching the whole path:
If there are publicly visible URL paths that might start with "/include" (say, "/includeMe"), a small addition will separate the private from the public URLs:
This one works as expected for all files/dirs with name started by dot even in subdirectories:
A better and simple way is as follow :
1 - Insert in your main conf (ie Outside VHOST world) :
with myDirectory = css, js, images ...
2 - You can set a per directory -Indexes as follow :
Allow your "DirectoryIndex" Apache directive content to be served :
and Deny directory index for others :
with myDirectory = *, css, images, js, secret, ... following your needs.
In that case you do not need to use
Options -Indexes
My solution to stop displaying directory's content as list and display 404 error is simple. Create .htaccess file in root directory of your project and write which directories should be protected.Directories structure
.htaccess
ErrorDocument 404 /your_root_directory/404.html The second line of .htaccess disallow access to list items in app directory and all its subridectories.
The third line of .htaccess disallow access to list items in models directory and all its subridectories.
The fourth of .htaccess line sets our own 404 error (if you do not want to show apache default error).
Remember to clear cache on your browser when you work with htaccess.
With rewrite mod:
Every file or dir who begin with a dot will be redirected to 404.
Or to change all 403,400 errors into 404 errors, put this at the end of /etc/apache2/conf.d/localized-error-pages OR into a .htaccess