HTTP_REFERER (se definido) é um URL absoluto que começa com um esquema. por exemplo.
http://localhost:8080/....
Assim, um CondPattern como ^localhost:8080(/|$) nunca corresponderia.
Note também que as diretivas RewriteCond aplicam-se apenas ao único RewriteRule que se segue, nem todas, como o seu primeiro exemplar de código parece sugerir.
RewriteRule ^/downloads /somePackage/index.php?id=2 [NC,L]
Um RewriteRule padrão como ^/downloads (ou seja, o caminho da URL que começa com uma barra) nunca corresponderá aos arquivos .htaccess por diretório. Em .htaccess files, o prefixo de diretório é primeiro removido do caminho do URL antes da correspondência de padrões. Então, isso precisaria ser ^downloads para corresponder a todos os URLs que começam com /downloads .
RewriteRule downloads/.*/? /somePackage/index.php?id=5 [NC,L]
Isso não corresponderá a localhost:8080/downloads , pois o padrão exige uma barra final.
ATUALIZAÇÃO:
I want localhost:8080/downloads to go to id=2 and localhost:8080/downloads/somedownload to go to id=5 and localhost:8080/downloads/anotherdownload to go to id=6 however for the question I have compacted it to /downloads/<everything-else> go to id=5
Eu assumo que /downloads não é um diretório físico no sistema de arquivos. Nesse caso, você deve usar um fim de string de âncora ( $ ) no padrão RewriteRule , ou tenha cuidado com a ordem em que você coloca essas diretivas (ou seja, mais específico primeiro).
Tente o seguinte:
# Only the URLs /downloads and /downloads/ (with and without trailing slash)
RewriteRule ^downloads/?$ /somePackage/index.php?id=2 [NC,L]
# Everything else that starts /downloads/<something>
RewriteRule ^downloads/. /somePackage/index.php?id=5 [NC,L]
É discutível se você deve estar pegando tanto /downloads como /downloads/ - idealmente, deve ser um ou outro.
Para capturar uma URL específica (por exemplo, /downloads/somedownload ), isso precisaria ser antes da regra "Tudo o mais ...":
RewriteRule ^downloads/somedownload$ /somePackage/index.php?id=5 [NC,L]