Skip to content
Advertisement

Remove the .php extension on all pages (NGINX)

Having tried all the solutions on Stack, I was not able to remove the .php extension.

I managed to make the URLs accessible: www.mydomain.com/login but the user can always change the URL to www.mydomain.com/login.php and I’d like to avoid that.

Here is a part of my config :

    location / {
                try_files $uri $uri.html  $uri/ @extensionless-php;
                index index.html index.htm index.php;
        }

    location ~ .php$ {
         try_files $uri =404;
         include fastcgi_params;
         fastcgi_intercept_errors on;
         fastcgi_pass unix:/run/php/php7.3-fpm.sock;
         fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
     }

     location @extensionless-php {
          rewrite ^(.*)$ $1.php last;
        }

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        location ~ /.ht {
                deny all;
     }

Advertisement

Answer

This might be what you’re looking for

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^.]+)$ $1.php [NC,L]

For .html extensions you just have to add this

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

If you want to add a trailing slash at the end you can ignore the code above and insert the code below.

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/$ $1.php
RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(.[a-zA-Z0-9]{1,5}|/)$
RewriteRule (.*)$ /$1/ [R=301,L]

If you’re using GoDaddy you need to enable MultiViews at the top of your .htaccess file

Options +MultiViews
User contributions licensed under: CC BY-SA
7 People found this is helpful
Advertisement