Apache mod_rewrite, múltiplas variáveis

1

Estou lutando um pouco com mod_rewrite e substituindo várias variáveis por expressões regulares. Estou tentando reescrever o seguinte:

www.mysite.com/avatars/funny/1

para:

www.mysite.com/avatars.php?genre=funny&page=1

Agora eu tenho o seguinte, que não está realmente dando certo:

RewriteRule ^/avatars/?(.*)/?(.*)$ /avatars.php?genre=$1&page=$2
    
por user745595 04.05.2012 / 15:03

3 respostas

4

O operador * é ganancioso. Isso significa que ele vai pegar o máximo que puder.

No seu exemplo, o primeiro bloco (.*) corresponderá a /funny/1 . O segundo não corresponderá a nada, mas tudo bem, porque * corresponde a "zero ou mais" do caractere anterior.

Usar um bloco diferente para combinar as partes entre as barras fará o truque. Algo parecido com isto:

RewriteRule ^/avatars/([a-z]*)/([0-9]*)$ /avatars.php?genre=$1&page=$2

ou isto:

RewriteRule ^/avatars/([^/]+)/([^/]+)$ /avatars.php?genre=$1&page=$2

Também não há necessidade do operador ? após as barras, para que haja duas variáveis, as barras devem estar lá.

O Apache também possui operadores relutantes , que são o oposto dos operadores gananciosos. Você pode usá-los adicionando um ponto de interrogação após um operador normalmente ganancioso. Assim:

RewriteRule ^/avatars/(.*?)/(.*?)$ /avatars.php?genre=$1&page=$2
    
por 04.05.2012 / 15:38
0

Você não precisa do ? , pois as barras não são opcionais. No entanto, você provavelmente precisará parar o processamento depois que essa regra for aplicada ([L]). Você pode tentar o seguinte?

RewriteRule ^/avatars/(.*)/(.*)$ /avatars.php?genre=$1&page=$2 [L]
    
por 04.05.2012 / 15:14
0

Eu acho que o seu uso de /? é o problema, tente isto:

RewriteEngine on
RewriteRule ^avatars/([^/]+)/([^/]+)$ avatars.php?genre=$1&page=$2 [L]
    
por 04.05.2012 / 15:14