Apache RewriteRules não funciona, mas funciona quando testado com outras ferramentas de regex?

1

Eu tenho esta regra:

RewriteEngine On
RewriteRule   ^/page/([a-zA-Z0-9]+)\?(.*)$    /index.php?page=$1&$2

Deve ser algo assim:

/page/contact?cake=lie

e vá para a página:

/index.php?page=contact&cake=lie

Eu testei isso com ferramentas como RegExr e RegexPal, e funciona lá. Mas ao colocá-lo na configuração do Apaches, visitar o URL dá a página Apaches 404.

Alguém pode ajudar?

    
por borntyping 12.11.2010 / 12:14

4 respostas

2

Se você quiser passar a string de consulta existente na íntegra, mod_rewrite fornece o QSA flag para esse propósito. Ao usá-lo, seu conjunto de regras pode ser simplificado da seguinte maneira:

RewriteEngine On
RewriteRule   ^/page/([a-zA-Z0-9]+)$    /index.php?page=$1 [QSA]

mod_rewrite irá então anexar automaticamente qualquer string de consulta existente àquela que você adicionou através de sua substituição. O resultado é efetivamente o mesmo que A abordagem de Steven Monai , mas sinto este método um pouco mais limpo.

    
por 12.11.2010 / 17:13
2

Por padrão, o mod_write corresponde ao REQUEST_URI, que contém apenas o URI, mas não os parâmetros dinâmicos, então descartará tudo após o ponto de interrogação.

Para combinar com o URI completo, você precisa usar THE_REQUEST (ou se houver outro método, por favor me ilumine!). Por favor, note que ele contém o pedido completo que o cliente enviou, por exemplo "GET / foo? Bar = baz HTTP / 1.1".

Tente algo como

RewriteCond %{THE_REQUEST} ^(.*)$
RewriteRule ^GET /page/([a-zA-Z0-9]+)\?(.*) HTTP.*$    /index.php?page=$1&$2
    
por 12.11.2010 / 12:31
0

Você tem o mecanismo de reescrita ativado?

RewriteEngine On
    
por 12.11.2010 / 12:17
0

A avaliação de Janne de por que sua regra não funciona está correta. Mas eu tomaria uma abordagem menos complicada para resolvê-lo:

RewriteRule ^/page/([a-zA-Z0-9]+)$ /index.php?page=$1&%{QUERY_STRING}

Não há necessidade de separar a solicitação bruta para obter a string de consulta quando o Apache já a entrega para você em %{QUERY_STRING} .

A lista de variáveis de servidor disponíveis para você por meio da sintaxe %{VARNAME} é documentada aqui .

    
por 12.11.2010 / 16:45