mod_rewrite .htaccess - Desenvolvimento Web - Portugal-a-Programar
By fil79, September 22, 2011 in Desenvolvimento Web
Estou a tentar usar o mod_rewrite (apache), para reescrever URL amigáveis.
Acontece que não consigo de maneira nenhuma, meter isto a funcionar, não faz nada:
RewriteRule /teste/([0-9]+) /index.php?id=$1 [PT,L]
o módulo está activo no Apache.
Reescrever o url. mas ao digitar dominio.com/index.php?id=1, não faz absolutamente nada.
E tirei este exemplo de um tutorial onde garantia que funcionava.
Em primeiro lugar, se dominio.com/index.php?id=1 não faz nada, tens algo errado no teu site, porque isso é o caminho directo. Se no próprio caminho directo não está a acontecer nada, é grave, e não tem nada que ver com o mod_rewrite.
Depois, o que a regra que apresentaste faz é encaminhar os pedidos no formato dominio.com/teste/1 para dominio.com/index.php?id=1, e não o inverso.
expliquei-me mal, quando referi que não fazia nada ao digitar dominio.com/index.php?id=1, era unicamente em relação relação ao mod_rewrite. A página carrega bem e tudo o resto.
Em relação à regra ficará assim:
RewriteRule index.php?id=$1([0-9]+) /teste [PT,L] ?
Ok, do princípio: o que é que queres que aconteça e como é que tens o teu sistema de ficheiros?
Reescrever o url passando dominio.com/index.php?id=1 para dominio.com/teste/1
Isto é, tens um ficheiro "index.php" na pasta "1", dentro da pasta "teste"? Não é isso, pois não?
O que tu queres é o inverso, e para isso serve a primeira regra que aqui colocaste. Quando acedes ao URL directo, a página vai responder sempre - pois se o ficheiro está lá! - e quando acedes ao URL a reescrever, também, obedecendo à regra.
exacto, o que pretendo é o inverso, continuo sem conseguir
mostra a árvore de ficheiros e pastas que tens, sff
Se eu usar esta expressão teste/([0-9]+) /index.php?id=$1 [PT,L]
recebo um erro 500.
ainda não percebi bem o funcionamento do mod_rewrite:
Por exemplo, como se aplicaria uma regra para o URL ficar assim
http://www.publico.pt/Mundo/navio-encontrado-no-fundo-do-atlantico-com-170-milhoes-de-euros-em-prata-1513790
Suponho ser isto:
/([^/]*)/.*?(\d+)$
Nota: não testado
Experimento algo do género:
RewriteRule ^teste/([0-9-]+)/?$ /teste.php?id=$1 [NC,L]
^ - Significa o início da regra
$ - Significa o fim da regra
/? - Significa uma barra opcional (ou seja, a reescrita acontecerá para URL do tipo omeudominio.com/teste e omeudominio.com/teste/)
Na última parte temos o que são chamados de flags. NC corresponde a no case (ignora a diferença entre maiúsculas e minúsculas) e L corresponde a last (quando essa regra for utilizada, nenhuma outra regra será usada).
^ - Significa o início da string (neste caso é o url)
$ - Significa o fim da string (neste caso é o url)
? - Significa que o caracter anterior ocorre 0 ou 1 vezes (digamos que o significado é que o caracter anterior (segundo:edgarfelix) é opcional).
Em nenhum momento referi que o carácter antes de ? significava um carácter opcional! Mas enfim, interpreta como achares melhor. Neste caso, referia que tendo isto /? (e sim sei que o carácter anterior ocorre 0 ou 1 vezes) seria para poder aceder a um URL com ou sem barra no fim, isto é, quando digitares a URL poderias ou não usar a barra.
Quando digo "Significa o início da regra / Significa o fim da regra" referia-me também a uma string, e uso a palavra "regra" para realçar que aquela string iria definir uma regra para a respectiva URL.
Mas tudo bem, com isto só demonstras que nem se quer interpretaste devidamente o que foi escrito.
... e L corresponde a last (quando essa regra for utilizada, nenhuma outra regra será usada).
A flag L serve para terminar uma série de condições dentro do módulo e enviar o resultado alterado para o módulo seguinte na ordem de inclusão do php.ini. Ou seja, esta flag não termina o processamento do Mod_Rewrite, mas sim passa o resultado de casa instrução em que se encontra para o módulo seguinte (ex: Mod_Alias)