Por que incomodar-se com uma reescrita complexa? O PHP pode lidar com isso muito mais fácil. Eu estava entediado, então coloquei um exemplo simples de trabalho .
Por padrão, o Apache httpd decodifica% 2f (uma barra) antes de processar a solicitação. Isto não tem nada a ver com o mod_rewrite. Eu não tenho idéia porque é habilitado por padrão. Coloque o seguinte na definição apropriada do VirtualHost. Desculpe, isso não funciona em um arquivo .htaccess.
AllowEncodedSlashes On
.htaccess
RewriteEngine On
RewriteRule /api/calc/.* api.php
api.php
<?php
define('STRIP_URI', '/api/calc/');
define('REGEX_URI', '/^(?P<calc>.+)(?P<ext>\.(txt|sci))?$/U');
$clean_request_uri = rawurldecode(str_replace(STRIP_URI, '', $_SERVER['REQUEST_URI']));
$math = array();
preg_match(REGEX_URI, $clean_request_uri, $math);
echo $math['calc'] . "<br/>";
echo $math['ext'] . "<br/>";
Atualizado para resolver totalmente o problema de codificação.
Atualizado novamente com solução alternativa para a decodificação de url do Apache.