Como redirecionar um url com espaço
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
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 seguinteRewriteRulepara 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]