Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Remove .html and .php extensions with .htaccess

How do I remove the file type from my webpages without creating a new directory and naming the file index.php. I want http://example.com/google.html to http://example.com/google.

How would I go about doing this.

PS: I tried looking at some other tutorials but there to confusing. I do now that it can be done in .htaccess

like image 596
SimplePi Avatar asked Feb 07 '14 01:02

SimplePi


People also ask

How do I remove HTML extension?

html extension can be easily removed by editing the . htaccess file.

What is .htaccess file in PHP?

The . htaccess (Hypertext Access) file is an Apache distributed server configuration file. You can use the . htaccess file to set server configurations for a specific directory. This directory can be the root directory of your website or another subdirectory where the .


2 Answers

Yes, I know that this question was asked multiple times already and is answered, but I will give a little more comprehensive answer based on my experience.

Here is the .htaccess code snippet that will help you:

# Apache Rewrite Rules
 <IfModule mod_rewrite.c>
  Options +FollowSymLinks
  RewriteEngine On
  RewriteBase /

# Add trailing slash to url
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/|#(.*))$
  RewriteRule ^(.*)$ $1/ [R=301,L]

# Remove .php-extension from url
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME}\.php -f
  RewriteRule ^([^\.]+)/$ $1.php 

# End of Apache Rewrite Rules
 </IfModule>

I want to stress some important things here for everybody's reference:

  • This code snippet doesn't remove entry scripts from url (such as index.php used by many PHP frameworks)
  • It only removes .php extension, if you want to remove other extension as well (e.g. .html), copy and paste 3rd block and replace php with other extension.
  • Don't forget to also remove extension from anchors (links) href.
like image 184
Arman P. Avatar answered Sep 18 '22 18:09

Arman P.


@armanP's accepted answer above does not remove .php extension from php urls. It just makes it possible to access php files without using .php at the end. For example /file.php can be accessed using /file or /file.php but this way you have 2 diffrent urls pointing to the same location.

If you want to remove .php completely, you can use the following rules in /.htaccess :

RewriteEngine on 
#redirect /file.php to /file
RewriteCond %{THE_REQUEST} \s/([^.]+)\.php [NC]
RewriteRule ^ /%1 [NE,L,R]
# now we will internally map /file to /file.php
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)/?$ /$1.php  [L]

To remove .html ,use this

 RewriteEngine on
 #redirect /file.html to /file
 RewriteCond %{THE_REQUEST} \s/([^.]+)\.html [NC]
 RewriteRule ^ /%1 [NE,L,R]
 # now we will internally map /file to/ file.html
 RewriteCond %{REQUEST_FILENAME}.html -f
 RewriteRule ^(.*)/?$ /$1.html  [L]

Solution for Apache 2.4* users :

If your apache version is 2.4 ,you can use the Code without RewriteConditions On Apache 2.4 we can use END flag instead of the RewriteCond to prevent Infinite loop error.

Here is a solution for Apache 2.4 users

 RewriteEngine on

 #redirect  /file.php to /file
  RewriteRule ^(.+).php$ /$1 [L,R]
 # now we will internally map /file to /file.php
 RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)/?$ /$1.php [END]

Note : If your external stylesheet or images aren't loading after adding these rules ,to fix this you can either make your links absolute changing <img src="foo.png> to <img src="/foo.png> .Notice the / before the filename . or change the URI base add the following to head section of your Web page <base href="/"> .

Your Webpage fails to load css and js due to the following reason :

When your browser url changes from /file.php to /file server thinks that /file is a directory and it tries to append that in front of all relative paths . For example : when your url is http://example.com/file/ your relative path changes to <img src "/file/foo.png"> thus the image fails to load . You can use one of the solutions I mentioned in the last peragraph to solve this issue.

like image 43
Amit Verma Avatar answered Sep 16 '22 18:09

Amit Verma