没有“.php”文件扩展但包含路径信息的Apache + PHP

I'm trying to figure out how to modify the .htaccess file so I can do two things:

  1. Not have to include the .php extension on my PHP files (e.g., a request to my.domain.com/page maps to my.domain.com/page.php).
  2. Do #1 while also including additional path info (e.g., a request to my.domain.com/page/path/stuff/here maps to my.domain.com/page.php/path/stuff/here).

I've found out how to do #1 by adding the following to the .htaccess file:

# Allow PHP files without ".php" extension.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/.]+)/?$ /$1.php [L,QSA]

However, now I'd like to modify the RewriteRule so it works for #2.

You could just try to use Multiviews, which is made to do exactly this:

Options +Multiviews
RewriteEngine On # Turn on the rewriting engine
RewriteRule ^([^\.]+)$ $1.php [NC,L] #Remove the .php

Not sure what you want with the pathing stuff though.

Edit based off your comment, I've used something like this with php/angular. It's probably not "correct" or the best way to do it, but it worked for me.

Htaccess

RewriteEngine       on
# Allow the API to function as a Front Controller
RewriteRule         ^api/(.*)$ api/index.php?rt=$1 [L,QSA,NC]
# Allow Angular to have Pretty URL's
RewriteCond         %{REQUEST_FILENAME} !-f
RewriteCond         %{REQUEST_FILENAME} !-d

api/index.php

// Pull the routing path
$router = explode('/', $_GET['rt']);

$version = $router[0];
$controller = $router[1];
$action = $router[2];

// Check for the file
if(file_exists($version . '/controllers/' . $controller .'.class.php')) {
    include $version . '/controllers/' . $controller .'.class.php';
} else {
    return false;
}

// Initialize and execute
$method = new $controller($action);
print $method->$action();

This lets me do something like: api/v1/users/login in the url, then will find the users.class.php file in the V1 folder, and run the function login.

OK, after searching for MultiViews, I found several articles warning against them (eh, to each his own), but that also led me to an answer that uses 2 rules instead of just 1:

RewriteRule ^([^\.]+)$ /$1.php [L]
RewriteRule ^([^\./]+)/(.*) /$1.php/$2 [L]

The first rule catches case #1 above, and the second rule catches case #2 above. Voila!