I am trying to remove the .php extension only from the file after the first slash.
Right now I have:
example.com/file.php/123123
What I want is:
example.com/file/123123
I have tried adding this code to the .htaccess file
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(e)/?$ /$1.php [L,NC]
It successfully removes the .php extension but only for the last part of the URL.
Meaning it reads:
example.com/file/123123
as:
example.com/file/123123.php
and then makes it unable to load because there is no 123123.php.
How can I make it so it only tries to remove the .php from the after the first slash?
Thanks
If you have mod_rewrite module installed and enabled, you can paste the following code into your apache2.conf file:
<Directory /path/to/site/folder>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ $1 [R,L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule (.*) $1.php [L]
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule (.*) $1.html [L]
</IfModule>
</Directory>
This module can be installed by default, so you can just try with this code. It may work.
My problem is that when I type the URL without .php extension (like as https://example.com/register) it worked, but when I click register link it redirect to https://example.com/register.php. I am trying to edit .htaccess file so that by default when I click register link URL should be without .php extension.
My go daddy .htaccess file code is
Options +MultiViews
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
Try this htaccess
RewriteEngine On
# Unless directory, remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/$ http://example.com/folder/$1 [R=301,L]
# Redirect external .php requests to extensionless url
RewriteCond %{THE_REQUEST} ^(.+)\.php([#?][^\ ]*)?\ HTTP/
RewriteRule ^(.+)\.php$ http://example.com/folder/$1 [R=301,L]
# Resolve .php file for extensionless php urls
RewriteRule ^([^/.]+)$ $1.php [L]
Use another if not work
RewriteEngine On
# remove the index file
RewriteCond %{THE_REQUEST} ^.*/index
RewriteRule ^(.*)index$ http://www.example.org/$1 [R=301,L]
# remove the .php extension
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(([^/]+/)*[^.]+)$ $1.php [L]
# redirect from .php to less php
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^/]+/)*[^.#?\ ]+\.php([#?][^\ ]*)?\ HTTP/
RewriteRule ^(([^/]+/)*[^.]+)\.php http://www.example.org/$1 [R=301,L]
apply this to your htaccess file
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^([^.]+)$ $1.php [NC,L]
it works for all(.php or no .php)
Options +MultiViews
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
You've enabled MultiViews (part of mod_negotiation) and you are also trying to append the file extension using mod_rewrite. You should do one or the other, not both. They both do essentially the same thing. MultiViews is probably "Winning", or worse, creating a conflict.
Your existing code is essentially the same as:
Options +MultiViews
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Thanks to all for contribution, and being ashamed myself not to reply your valuable efforts because my boss was asign me a different project.
working code is
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
Additionally also remove .php extention from
Example all anchor tag of the page.
you can check here https://doxdocs.com/
I found this script or removing extensions from php files:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
While this works, it still allows files to be accessed if you type them in with their extension, which I don't want.
I tried the following:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([.]+)$ $1.php [NC,L]
I also tried ^(.*)$ and ^(.+)$
which seems like it should do the job, because it would do this:
index.php -> index.php.php
but somehow, it doesn't work as expected.
So how do I update the above .htaccess script to disallow file extensions?
EDIT:
My .htaccess script seems to be detecting the files correctly:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule "^.*\.php$" "other.html" [L]
RewriteRule "^([^\.]+)$" "other2.html" [L]
The pages other.html and other2.html simply contain the words "OTHER" and "OTHER 2"
Now, using the above script, the output is as expected:
"/test.php" gives output "OTHER"
"/test" gives "OTHER 2"
but if I update the script to the following, both url variations start returning "OTHER"
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule "^.*\.php$" "other.html" [L]
RewriteRule "^([^\.]+)$" "$1.php" [L] // changed
So it seems that after the extensionless filename has ".php" added to it by rule#2, it somehow gets caught by rule #1.
Aren't these rules ordered? and isn't [L] supposed to stop processing on a match?
EDIT 2:
So assuming [L] did what I was expecting... the following script would work...
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule "^.*\.php$" "404.html" [L]
RewriteRule "^([^\.]+)$" "$1.php" [L]
Try this solution How to remove file extension from website address?
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php
edit: you can do a filematch to prevent executing all .php except index.php. I typically route most of my pages through index.php anyways so this solution would work if you only have a handful of base index files (index1.php,index2.php,etc). I'm sure you can come up with something from this if you don't find a working solution.
<FilesMatch "\.php$">
Order Allow,Deny
Deny from all
</FilesMatch>
<FilesMatch "index[0-9]?\.php$">
Order Allow,Deny
Allow from all
</FilesMatch>
This works:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule "^.*\.php$" "404.html" [END]
RewriteRule "^([^\.]+)$" "$1.php" [END]
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
I am trying to redirect requests to http://www.site.com/customer to https://www.site.com/customer and hide .php extensions, but it's not working. These are my configuration files:
httpd.conf:
LoadModule rewrite_module modules/mod_rewrite.so
mysite.conf:
<Directory /var/www/site/customer>
Order Deny,Allow
Allow from all
</Directory>
Alias /customer /var/www/site/customer
.htaccess in /var/www/site/customer:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}
#unless directory, remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ $1 [R=301,L]
#redirect external .php requests to extensionless url
RewriteCond %{THE_REQUEST} ^(.*)\.php([#?][^\ ]*)?\ HTTP/
RewriteRule ^(.*)\.php$ $1 [R=301,L]
#resolve .php file for extensionless php urls
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [L]
Am I missing something?
Yep you are missing something ;)
Here are some modifications:
you forgot the redirect and last tag in HTTPS rule
you forgot the QSA directive to keep the query string when there's a redirect
So here it is, this might help, but maybe won't work 100% (but it's far still better than it was anyway):
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://$1 [QSA,NC,L]
#unless directory, remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ $1 [QSA,R=301,L]
#redirect external .php requests to extensionless url
RewriteCond %{THE_REQUEST} ^(.*)\.php([#?][^\ ]*)?\ HTTP/
RewriteRule ^(.*)\.php$ $1 [QSA,R=301,L]
#resolve .php file for extensionless php urls
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [QSA,L]
Two hints:
If you're not in a hosted environment (= if it's your own server and you can modify the virtual hosts, not only the .htaccess files), try to use the RewriteLog directive: it helps you to track down such problems:
# Trace:
# (!) file gets big quickly, remove in prod environments:
RewriteLog "/web/logs/mywebsite.rewrite.log"
RewriteLogLevel 9
RewriteEngine On
My favorite tool to check for regexp:
http://www.quanetic.com/Regex (don't forget to choose ereg(POSIX) instead of preg(PCRE)!)