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.
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!