Como reescrever um usuário de um URL não reescrito para um URL reescrito

3

Eu tenho dois URLs. Um se parece com esse caminho (que é um URL não reescrito):

  1. www.example.com/article.php?id=12

E o próximo é assim (que é uma URL reescrita):

  1. www.example.com/article/12

Ambas as URLs estão funcionando. O que eu quero saber é se um usuário visita o primeiro URL ele pode ser redirecionado para o segundo URL automaticamente? Como posso conseguir isso? Existe uma maneira de fazer o mesmo usando apenas o arquivo .htaccess ?

Além disso, por favor, ajudem se eu quiser incluir o título também com este meu feio url ficará assim.

www.example.com/article.php?id=12&title=sometitle

E a URL bonita esperada é assim

www.example.com/article/12/sometitle

A regra de redirecionamento que estou usando é semelhante a esta

RewriteRule ^article/(\d+)/([\w-]+)$ article.php?id=$1&title=$2[R=302,L]

Eu não quero que os usuários vejam o URL feio, mesmo que ele visite o feio também.

    
por arunwebber 29.12.2016 / 10:40

1 resposta

0

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]
    
por 29.12.2016 / 10:57

Tags