Com redirecionamentos como esse, você precisa ser extremamente cuidadoso com os loops de redirecionamento, já que você já está reescrevendo internamente ao contrário (de /article/12
a /article.php?id=12
). Para evitar o loop de redirecionamento, você pode verificar o URL em relação à variável de servidor THE_REQUEST
, que mantém o cabeçalho da solicitação inicial e não muda quando a URL é regravada.
Assim, você pode fazer algo parecido com o seguinte, próximo ao topo do seu arquivo .htaccess
, antes de reescrever .
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([\w-]+)\.php\?id=(\d+)\ HTTP
RewriteRule ^[\w-]+\.php$ /%1/%2? [R=302,L]
(Altere o 302
(temporário) para um redirecionamento 301
(permanente) quando tiver certeza de que está funcionando OK. Os 301s são armazenados em cache pelo navegador para tornar o teste problemático. Como alternativa, verifique se você testou o cache do navegador desativado .)
O ?
no final da RewriteRule
substituição é necessário para remover a consulta original da solicitação. (Como alternativa, você pode usar o sinalizador QSD
no Apache 2.4 +)
O padrão RewriteRule
é apenas uma verificação rápida para garantir que processamos apenas URLs semelhantes àquelas que desejamos segmentar. As backreferences %1
e %2
referem-se ao CondPattern .
O padrão [\w-]+
corresponde ao artigo "nomes" que contêm a palavra caracteres a
- z
, A
- Z
, 0
- 9
, _
e -
. Se os nomes dos artigos forem apenas minúsculos a
- z
, altere esse padrão para [a-z]+
. É melhor ser mais restritivo com o regex.
Da mesma forma \d+
corresponde a qualquer número de dígitos ( 0
- 9
).
UPDATE # 1: Parece (a partir de comentários) que "article" é a palavra literal, em vez de uma palavra que representa qualquer artigo. Nesse caso, as diretivas acima podem ser simplificadas:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(article)\.php\?id=(\d+)\ HTTP
RewriteRule ^article\.php$ /%1/%2? [R=302,L]
UPDATE # 2: Para incorporar um "título", você pode apenas estender o exemplo acima (embora eu não saiba por que você precisaria fazer isso). Então, para redirecionar de /article.php?id=12&title=some-title
para /article/12/some-title
, você pode fazer algo como:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(article)\.php\?id=(\d+)&title=([\w-]+)\ HTTP
RewriteRule ^article\.php$ /%1/%2/%3? [R=302,L]