RewriteCond %{REQUEST_FILENAME}.php -f RewriteCond %{REQUEST_URI} !/$ RewriteRule (.*) $1\.php [L] : RewriteRule ^users/([a-zA-Z0-9_-]+)/?$ users.php?id=$1 [NC,L]
O primeiro bloco de regras está capturando uma solicitação para /users/Username . Neste caso, REQUEST_FILENAME é .../users (o primeiro segmento de caminho completo após um diretório válido) e .../users.php é de fato um arquivo válido neste caso. No entanto, você está anexando .php ao final do URL solicitado, então /users/Username se torna /users/Username.php , /users/Username.php.php , etc.
Você pode contornar esse conflito simplesmente invertendo a ordem dessas diretivas:
RewriteRule ^users/([a-zA-Z0-9_-]+)/?$ users.php?id=$1 [L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteCond %{REQUEST_URI} !/$
RewriteRule (.*) $1.php [L]
Agora, uma solicitação para /users/Username será capturada pela primeira regra e roteada corretamente para user.php?id=Username , que não corresponderá ao segundo bloco de regras.
(Eu removi o NC flag já que você está verificando o a-zA-Z no padrão . A menos que /users possa ser /uSeRs também ?!)