user1097431
user1097431

Reputation: 311

Remove file extensions using htaccess in subdirectories

I'm trying to remove file extensions with htaccess, so www.mysite.com/file.php becomes www.mysite.com/file.

I'm using the following code in the .htaccess file:

Options +FollowSymLinks
Options +Indexes
RewriteEngine on
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^([^\.]+)$ $1.php [NC,L]

So far, so good. Where it falls down is in subfolders: www.mysite.com/subfolder/file.php becomes www.mysite.com/file.

I've tried uploading another .htaccess file in the subfolder, but it still does the same. It feels like it should be really simple, but I'm struggling...can anyone help me out? Thanks!

Edit Sorry folks, should have said - the file is in a subfolder like so:

www.mysite.com/folder/subfolder/file.php

The .htaccess file is in /folder, the URL changes to this format:

www.mysite.com/subfolder/file

Apologies for misleading.

Upvotes: 1

Views: 5799

Answers (3)

anubhava
anubhava

Reputation: 785266

This is the rule you'll need to hide .php extension. This goes into your .htaccess in the DOCUMENT_ROOT directory:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On

# To internally redirect /dir/foo to /dir/foo.php
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [L]

Upvotes: 6

user229044
user229044

Reputation: 239302

You shouldn't be using rewrite rules for this. Apache has built-in option explicitly for doing what you're trying to do, called MultiViews, and that's what you should be using:

The effect of MultiViews is as follows: if the server receives a request for /some/dir/foo, if /some/dir has MultiViews enabled, and /some/dir/foo does not exist, then the server reads the directory looking for files named foo.*, and effectively fakes up a type map which names all those files, assigning them the same media types and content-encodings it would have if the client had asked for one of them by name. It then chooses the best match to the client's requirements.

Just add Options MultiViews to your .htaccess, and make sure that AllowOverride is properly configured.

Upvotes: 1

SoWhat
SoWhat

Reputation: 5622

A guess in the wild Try

  RewriteRule ^(.+)$ $1.php [NC,L]

Upvotes: 0

Related Questions