Como redirecionar um url com espaço

Dec 30 2016

Estou redirecionando deste URL

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

para este URL

www.example.com/article/12/some-title

Usando essas regras de reescrita de URL

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(article)\.php\?id=(\d+)&title=([\w-]+)\ HTTP
RewriteRule ^article\.php$ /%1/%2/%3? [R=301,L]
RewriteRule ^article/(\d+)/([\w-]+)$ article.php?id=$1&title=$2[R=301,L]

Mas se o URL tiver um espaço , por exemplo

www.example.com/article.php?id=12&title=some%20title

Então a regra acima não funcionará. Como posso fazer este URL funcionar com a regra mencionada acima apenas usando .htaccess?

Respostas

1 MrWhite Dec 30 2016 at 10:15
RewriteRule ^article/(\d+)/([\w-]+)$ article.php?id=$1&title=$2[R=301,L]

Um problema secundário, mas está faltando um espaço antes das RewriteRulebandeiras, o que resultará em uma reescrita incorreta. Ele deve ser: ...&title=$2 [R=301,L].

Com relação ao caractere de espaço ( %20quando URL / porcentagem codificada) ... THE_REQUESTcontém o caractere codificado de URL, mas o caminho de URL correspondido ao RewriteRule padrão é decodificado por URL (ou seja, um espaço literal). No exemplo acima, isso significa dois padrões regex diferentes. Portanto, para corresponder a um espaço no, titlevocê pode modificar suas regras existentes da seguinte forma:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(article)\.php\?id=(\d+)&title=([\w%-]+)\ HTTP
RewriteRule ^article\.php$ /%1/%2/%3? [NE,R=301,L]
RewriteRule ^article/(\d+)/([\w\s-]+)$ article.php?id=$1&title=$2 [R=301,L]

Cada diretiva é ligeiramente modificada.

  • O CondPattern agora permite um caractere de porcentagem literal (ou seja, [\w%-]).
  • O NEsinalizador é obrigatório no seguinte RewriteRulepara evitar que o espaço codificado da URL seja codificado duas vezes (por exemplo, %2520).
  • E o último RewriteRulerequer \s(qualquer caractere de espaço em branco) sendo adicionado ao padrão . (Como alternativa, você pode apenas usar um espaço de escape de barra invertida, ou seja \, ou apenas um espaço e colocar todo o padrão entre aspas duplas.)

Isso permite apenas o espaço adicional . Embora o CondPattern agora permita qualquer caractere codificado em porcentagem, o RewriteRulepadrão restringe isso a espaços em branco .


ATUALIZAÇÃO # 1: Para permitir alguns caracteres adicionais ... [\w%-](tudo entre colchetes) é uma classe de caracteres regex . Para permitir mais caracteres, você apenas adiciona esses caracteres à classe de caracteres. por exemplo. No caso de ,, 'e ;, isso se torna [\w%,';-]. Observe que o hífen ( -) deve aparecer no início ou no final da classe de caractere, uma vez que é um metacaractere especial.

Para permitir qualquer caractere, você pode alterar o padrão para .+. Que é simplesmente 1 ou mais caracteres. O ponto indica qualquer caractere. Então, isso se tornaria:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(article)\.php\?id=(\d+)&title=(.+)\ HTTP
RewriteRule ^article\.php$ /%1/%2/%3? [NE,R=301,L]
RewriteRule ^article/(\d+)/(.+) article.php?id=$1&title=$2 [R=301,L]