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]