I need some help with my Htaccess code.
RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule (.*)\.php$ $1 [R=301]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} /$
RewriteRule (.*)/ $1 [R=301]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteCond %{REQUEST_URI} !/$
RewriteRule (.*) $1\.php [L,QSA]
My Directory Structure is:
Public_Html
css/style.css
img/icon.png
/2/user.php
index.php
create.php
Now the above htaccess code is removing the .php extension from the URL.
Examples
-> example.com/index.php -> example.com/index
-> example.com/2/user.php -> example.com/2/user
Problems with this Htaccess File
I want to hide the index too
Example: example.com/index -> example.com
If user types example.com/index.php then he should be redirected to example.com
If user type things which do not exist then it should point to example.com
Example: example.com///*/// -> example.com
When it removes the .php extension then a trailing slash should be added to the end.
Example: example.com/create.php -> example.com/create/
If a user wants to access create.php and enter /create without / at the end then it should be automatically added.
Example: example.com/create -> example.com/create/
In other words, if after removing .php these both works as same
**Example:** example.com/create = example.com/create/
But user should still be able to access the directory
Example: example.com/2 -> example.com/2/
Here 2 is a folder.
I have some problem with this htaccess script. I searched a lot on Google and Stack Overflow but still can't find any solution.
*This is not a duplicate question. Please check it carefully before marking it as a duplicate. I would be glad if you help me.
Here is everything you need, all questions are answered with code, information, and examples! Providing 1 by 1 step for what each does and then the whole code!
1-) Resolving .php extension
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [L]
example.com/user.php will be working if you go to example.com/user
2-) Redirecting wrong links that don't exist to example.com
If a user types a link which doesn't exist, for example, example.com///*, the user will be automatically redirected to example.com
<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
3-) Redirect example.com/index.php or example.com/index to example.com
RewriteCond %{THE_REQUEST} /index(\.php)?[/?\s] [NC]
RewriteRule ^(.*?)index(?:\.php)?$ /$1 [L,R=301,NC,NE]
4-) Remove trailing slash if it is not a directory else add
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [R=301,L]
If you have a trailing slash added after a normal file, this will remove it. If it is a directory and has, it will remain. If it doesn't have, a trailing slash will be automatically added to it.
You will be able to access directories!
5-) Removing .php from URL ( Redirect to file name without .php )
RewriteCond %{THE_REQUEST} \.(php|cfm)[\s?] [NC]
RewriteCond %{DOCUMENT_ROOT}/$1\.php -f [NC]
RewriteRule ^(.+?)\.(cfm|php)$ /$1 [R=301,L,NE]
The whole code together for .htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [R=301,L]
RewriteCond %{THE_REQUEST} /index(\.php)?[/?\s] [NC]
RewriteRule ^(.*?)index(?:\.php)?$ /$1 [L,R=301,NC,NE]
RewriteCond %{THE_REQUEST} \.(php|cfm)[\s?] [NC]
RewriteCond %{DOCUMENT_ROOT}/$1\.php -f [NC]
RewriteRule ^(.+?)\.(cfm|php)$ /$1 [R=301,L,NE]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [L]
<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
I hope this has helped you.
Happy to help, enjoy!
I'm trying to hide .php extension from my website while forcing trailing slash, I've been searching for the last few days with no success.
The site is running in a XAMPP server currently.
Here's the .htaccess file:
Options -Indexes -Multiviews +FollowSymlinks
RewriteEngine On
RewriteBase /
#removing .php extension
RewriteCond %{THE_REQUEST} ^GET\ /[^?\s]+\.php
RewriteRule (.*)\.php$ /$1/ [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^/(.+)/$
RewriteCond %{DOCUMENT_ROOT}/%1.php -f
RewriteRule ^(.*)/$ $1.php [L]
#forcing trailing slash
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule .*[^/]$ $0/ [L,R=301]
ErrorDocument 404 http://localhost/404/
These links work:
localhost/about-us redirects to localhost/about-us/ which is correct but when I try to access localhost/about-us.php, it redirects to localhost/about-us/ instead of localhost/about-us/. (sorry can't post links)
How can this be fixed?
You just seem to have accidentally used an absolute path. Just remove the slash at the beginning of /$1/ like your other rules to make it work properly.
#removing .php extension
RewriteCond %{THE_REQUEST} ^GET\ /[^?\s]+\.php
RewriteRule (.*)\.php$ $1/ [L,R=301]
Ubuntu 14.04LTS 32bit
LAMP
I know it's an old question but..
I need it to remove .php anywhere it finds it from the visible url.
It needs to work with /showthread.php?id=XX ---> /showthread?id=XX
I can't even get it to work with /page.php --> /page.
I've tried these:
Remove .php extension with .htaccess
How to hide the .html extension with Apache mod_rewrite
Remove .php from urls with htaccess
How to stop .htaccess loop
It just does nothing at all.
While other .htaccess code works fine..
While
<?php
phpinfo();
Lists mod_rewrite in Loaded Modules
And
<?php
if(!function_exists('apache_get_modules') ){ phpinfo(); exit; }
$res = 'Module Unavailable';
if(in_array('mod_rewrite',apache_get_modules()))
$res = 'Module Available';
?>
<html>
<head>
<body>
<p><?php echo apache_get_version(),"</p><p>mod_rewrite $res"; ?></p>
</body>
</html>
Returns Module Available
Tried many more things
# 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>
#
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^([^\.]+)$ $1.php [NC,L]
#
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php
Not even this has any effect whatsoever:
RewriteRule ^page$ page.php [L]
sudo service apache2 restart does not change anything.
Server reboot changes nothing.
I tried clearing other code inside, did not make any change.
I cleared my browser cache 100 times
I'm starting to think that it just hates me. What could possible be causing this??
Hope helped.
It's worked for me.
Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /
# For LocalHost !.php
RewriteCond %{HTTP_HOST} !=localhost
RewriteCond %{HTTP_HOST} !=127.0.0.1
RewriteCond %{REMOTE_ADDR} !=127.0.0.1
RewriteCond %{REMOTE_ADDR} !=::1
## hide .php extension
# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=302,L]
# To internally forward /dir/foo to /dir/foo.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ $1.php [L]
Check this link.
This is the answer using .htaccess:
RewriteEngine On
# browser requests PHP
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^\ ]+)\.php
RewriteRule ^/?(.*)\.php$ /$1 [L,R=301]
# check to see if the request is for a PHP file:
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^/?(.*)$ /$1.php [L]
Tested it on Windows with WAMP and working.
try this to remove .php extensions completly from your file and to avoid infinite loop:
RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ $1.php [NC,L]
This code will work in Root/.htaccess, Be sure to change the RewriteBase if you want to place this to a htaccess file in sub directory.
You may be on the right track. However, it sounds like your .htaccess file is not being executed. Just because a module is activated, does not mean it is available for you in your particular situation.
Here are some steps to solve your issue:
First of all, check the spelling very carefully. Verify that it is spelled correctly (including the . at the beginning)
Check the file permissions. Some servers are going to require executable permissions. So chmod the file to 755.
If you still do not have it working, go into your apache configuration (probably at /etc/apache2/apache2.conf on Ubuntu) and find every instance of AllowOverride. It might be set to 'none'. Change this to AllowOverride all instead.
Then go into sites-enabled, find your site configuration, and change the AllowOverride fields there are well.
Restart your Apache server and congratulate yourself with a big cup of coffee.
One of these should fix it. I would recommend trying between each step so that you can pinpoint where the error occurred. After determining the cause, you may want to go back and restrict some of those AllowOverrides, depending on your needs.
Best of luck!
You can try the following.
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+?)/?$ $1.php$2 [L]
It works for me:
#On rewrite
RewriteEngine On
# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# rewrite domain.com/username.php to username
RewriteRule ^([A-Za-z0-9_-]+)/?$ $1.php [NC,L]
RewriteRule ^([A-Za-z0-9_-]+)/([A-Za-z0-9]+)/?$ $1/$2.php [NC,L]
RewriteRule ^([A-Za-z0-9_-]+)/([A-Za-z0-9]+)/([A-Za-z0-9]+)/?$ $1/$2/$3.php [NC,L]
And more:
Look at my rewrite file for social portal like fb:
# allow only from ip range /8 /16 /24 /31
#Order deny,allow
#Deny from all
#Allow from 89.230.0.0/16
# On rewrite
RewriteEngine On
# [NC]- case-insensitive
# [L] - Last Rule , stop the rewriting process here
# [OR] = Or - If it matches this condition or the next
# [QSA] - Append query string to rewriting url
# [R] - redirect [R=301] move permanently, 302 - temporarily, 403 - Forbidden, 404 - Not Found, 410 - Gone
# fix folder redirect images and css js/images/css/media
RewriteRule ^.+?/((img|css|js|media|upload|posts)/.+)$ /$1 [L,R=301,NC]
# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# does not work on IIS windows server url rewrite when importing
# RewriteCond %[REQUEST_FILENAME] !-l
# rewrite example.xx/index.php na example.xx/
RewriteCond %{THE_REQUEST} ^.*/index\.php
RewriteRule ^(.*)index\.(php|html?)$ / [R=301,NC,L]
#portfolio rewrite folder rewrite
# RewriteRule ^([portfolio]+)/?$ /portfolio/index.php?id=$1 [NC,L]
# pretty url example.xx/id/post/number
# rewrite domain.com/username like twitter or facebook users
RewriteRule ^([A-za-z0-9_-]+)/?$ index.php?username=$1 [NC,L]
# domain.com/post/name
RewriteRule ^([A-Za-z0-9_-]+)/([A-Za-z0-9]+)/?$ profil.php?id=$1&menu=$2 [NC,L]
# domain.com/cat/post/id
RewriteRule ^([A-Za-z0-9_-]+)/([A-Za-z0-9]+)/([0-9]+)/?$ profil.php?id=$1&menu=$2&page=$3 [NC,L]
#RewriteRule ^([A-Za-z0-9_-]+)/(ustawienia)/?$ ustawienia.php?id=$1&menu=$2 [NC,L]
#RewriteRule ^([A-Za-z0-9_-]+)/(wpisy)/?$ profil0.php?id=$1&menu=$2 [QSA,NC,L]
#RewriteRule ^([A-Za-z0-9_-]+)/(fani)/?$ profil1.php?id=$1&menu=$2 [QSA,NC,L]
#RewriteRule ^([A-Za-z0-9_-]+)/(ogladasz)/?$ profil2.php?id=$1&menu=$2 [QSA,NC,L]
#RewriteRule ^([A-Za-z0-9_-]+)/(zdjecia)/?$ profil3.php?id=$1&menu=$2 [QSA,NC,L]
#RewriteRule ^([A-Za-z0-9_-]+)/(video)/?$ profil4.php?id=$1&menu=$2 [QSA,NC,L]
#RewriteRule ^([A-Za-z0-9_-]+)/(ulubione)/?$ profil5.php?id=$1&menu=$2 [QSA,NC,L]
#RewriteRule ^([A-Za-z0-9_-]+)/(wiadomosci)/?$ profil6.php?id=$1&menu=$2 [QSA,NC,L]
#RewriteRule ^([A-za-z0-9_-]+)/?$ profil.php?id=$1 [NC,L]
#RewriteRule ^([A-Za-z0-9_-]+)/([A-Za-z0-9]+)/?$ profil.php?id=$1&menu=$2 [NC,L]
#RewriteRule ^([A-Za-z0-9_-]+)/([A-Za-z0-9]+)/([A-Za-z0-9]+)/?$ index.php?id=$1&dir=$2&post=$3 [NC,L]
# Redirect all subdomains
# RewriteCond %{HTTP_HOST} ^(.*)\.breakermind\.com
# RewriteRule ^(.*)$ http://breakermind.com/$1 [R=301,QSA,NC,L]
# Redirect all subdomains
# RewriteCond %{HTTP_HOST} ^www.ns2.breakermind.com [NC]
# RewriteRule ^(.*)$ http://breakermind.com/$1 [R=301,QSA,NC,L]
# RewriteCond %{HTTP_HOST} ^ns2.breakermind.com [NC]
# RewriteRule ^(.*)$ http://breakermind.com/$1 [R=301,QSA,NC,L]
# Redirect from www. to non-www (unhash if need)
# RewriteCond %{HTTP_HOST} ^www.breakermind.com [NC]
# RewriteRule ^(.*)$ http://breakermind.com/$1 [R=301,QSA,NC,L]
# Redirect from http:// to https:// (from no-ssl to ssl)
#RewriteCond %{SERVER_PORT} 80
#RewriteRule ^(.*)$ https://breakermind.com/$1 [R=301,QSA,NC,L]
ErrorDocument 400 /er404.html
ErrorDocument 401 /er404.html
ErrorDocument 402 /er404.html
ErrorDocument 403 /er403.html
ErrorDocument 404 /er404.html
ErrorDocument 500 /er404.html
ErrorDocument 502 /er404.html
ErrorDocument 504 /er404.html
#RewriteEngin On
#RewriteCond %[REQUEST_FILENAME] !-d
#RewriteCond %[REQUEST_FILENAME] !-f
#RewriteCond %[REQUEST_FILENAME] !-l
#RewriteRule ^(.+)$ index.php?c=$1 [QSA,L]
#
# \w = [A-Za-z0-9_] \d = [0-9]
And here from my blog system:
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{THE_REQUEST} ^.*/index\.php
RewriteRule ^(.*)index\.(php|html?)$ / [R=301,NC,L]
# category
RewriteRule ^category/?$ index.php?id=0&page=0 [NC,L]
RewriteRule ^category/([A-Za-z0-9]+)/?$ index.php?id=$1&page=0 [NC,L]
RewriteRule ^category/([A-Za-z0-9]+)/([0-9]+)/?$ index.php?id=$1&page=$2 [NC,L]
RewriteRule ^category/([A-Za-z0-9]+)/([0-9]+)/([A-Za-z0-9]+)/?$ index.php?id=$1&page=$2&title=$3 [NC,L]
# autor
RewriteRule ^autor/?$ index.php?id=0&page=0 [NC,L]
RewriteRule ^autor/([A-Za-z0-9]+)/?$ index.php?id=$1&page=0 [NC,L]
RewriteRule ^autor/([A-Za-z0-9]+)/([0-9]+)/?$ index.php?id=$1&page=$2 [NC,L]
# article, gallery, tags
RewriteRule ^article/([A-Za-z0-9]+)/?$ article.php?id=$1 [NC,L]
RewriteRule ^gallery/([A-Za-z0-9]+)/?$ gallery.php?id=$1 [NC,L]
RewriteRule ^tags/([A-Za-z0-9]+)/?$ tags.php?id=$1 [NC,L]
RewriteRule ^archive/([0-9]+)/([0-9]+)/?$ archive.php?year=$1&month=$2 [NC,L]
# custom page rewrite
RewriteRule ^page/([A-Za-z0-9]+)/?$ page.php?id=$1 [NC,L]
# fix folder redirect images and css js/images/css/media
RewriteRule ^.+?/((admin|img|css|js|media|upload|posts)/.+)$ /blog/$1 [L,R=301,NC]
# user or category user.php
# RewriteRule ^([A-Za-z0-9]+)/?$ index.php?user=$1 [NC,L]
# example
# RewriteRule ^([folder])/([category])/([A-Za-z0-9]+)/?$ index.php?id=$3&cat=$2 [NC,L]
Assuming that .htaccess is being processed, then this super simple .htaccess should work for you:
RewriteEngine on
RewriteRule (.*) $1.php [END]
If it doesn't work, there is something wrong with your Apache configuration.
You need to look into that first.
If it works, add the following line before the RewriteRule to allow serving other files:
RewriteCond %{REQUEST_FILENAME} !-f
The END flag is available since Apache 2.3.9.
RewriteEngine on //replacement launch
RewriteCond %{REQUEST_FILENAME} !-d //If the requested object is not a folder
RewriteCond %{REQUEST_FILENAME}\.php -f //If the requested object to append the extension php - file
RewriteRule ^(.*)$ $1.php //make the change from concatenating .php
Enabling mod_negotiation in my Apache config did the trick for me:
Content negotiation, or more accurately content selection, is the selection of the document that best matches the clients capabilities, from one of several available documents.
It's working, You can try this code.
1. First create .htaccess file in your main directory and paste the same code after that clear your history and its working.
RewriteEngine on
RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]
Maybe this could be a duplicate, but take a look at this:
How to remove .html from URL
In the solution, just change html to php
The target is to combine several rules:
never have a trailing slash in the URI
internally rewrite to the index.php (domain.tld/somedir/index.php) when calling domain.tld/somedir
remove file extensions, check if + '.php' exists and eventually internally rewrite to it
This is to be done in '.htaccess' as this is my only accessible .
My attempt so far
# check if *.php exists
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*[^/])/?$ $1.php [L, QSA]
# do not allow trailing slash
RewriteRule (.*)/ $1 [L, R=301]
The difficulty here is that the query 'domain.tld/somedir' normally calls the directory's index.php after having been redirected to 'domain.tld/somedir/'. However, I would like the index.php to be internally called (no 301) directly when querying 'domain.tld/somedir'.
You can use this code:
DirectoryIndex index.php
RewriteEngine On
# remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{THE_REQUEST} \s(.+?)/+[?\s]
RewriteRule ^(.+?)/$ /$1 [R=301,L]
# To internally forward /dir/file to /dir/file.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1.php -f [NC]
RewriteRule ^(.+?)/?$ /$1.php [L]
There is a separate setting in apache called DirectorySlash that can be enabled/disabled. You can read more at httpd.apache.org/docs/2.2/mod/mod_dir.html#directoryslash but be sure to read the part about why this is done right below where it says "some good reasons". Also note the security issue.
I've just realised that if you were to manually type in the URL bar a page that doesn't exist on my site, the site responds with an Internal Server Error.
Should it not be a 404 page not found?
My site is http://www.cristianrgreco.com, for example http://www.cristianrgreco.com/example will return a server error.
This is an error I frequently encountered when toying with .htaccess files so I have posted mine below.
RewriteEngine On
Options +FollowSymLinks
# Add WWW to URL
RewriteCond %{HTTP_HOST} ^cristianrgreco\.com$ [NC]
RewriteRule ^(.*)$ http://www.cristianrgreco.com/$1 [L,R=301]
# Remove trailing slashes from end of URL
RewriteCond %{HTTP_HOST} !^\.cristianrgreco\.com$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [L,R=301]
# Rewrite article URLs
RewriteRule ^articles/([a-zA-Z0-9_-]+)/?$ articles.php?article=$1
# Remove file extension from PHP files
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ $1.php [L,QSA]
Thanks in advance for your help.
I have encountered this problem before, the problem is this line
RewriteRule ^(.*)$ $1.php [L,QSA]
replacing it with RewriteRule ^([^\.]+)$ $1.php [NC,L,QSA] seems todo the trick. the enclosing brackets signify that anything that is matched will be remembered by the RewriteRule. Inside the brackets, it says “I’d like one or more characters that aren’t a dot”.
<IfModule mod_rewrite.c>
Options +FollowSymLinks
Options +Indexes
RewriteEngine On
# Add WWW to URL
RewriteCond %{HTTP_HOST} ^cristianrgreco\.com$ [NC]
RewriteRule ^(.*)$ http://www.cristianrgreco.com/$1 [L,R=301]
# Remove trailing slashes from end of URL
RewriteCond %{HTTP_HOST} !^\.cristianrgreco\.com$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [L,R=301]
# Rewrite article URLs
RewriteRule ^articles/([a-zA-Z0-9_-]+)/?$ articles.php?article=$1
# Remove file extension from PHP files
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^([^\.]+)$ $1.php [NC,L,QSA]
</IfModule>