Como redirecionar uma URL que tenha espaço nela

1

Estou redirecionando dessa 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 regravação 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 a URL tiver um espaço , por exemplo

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

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

    
por arunwebber 30.12.2016 / 10:20

1 resposta

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

Um problema secundário, mas falta um espaço antes dos RewriteRule flags que resultarão em uma reescrita incorreta. Deve ser: ...&title=$2 [R=301,L] .

Com relação ao caractere de espaço ( %20 quando codificado por URL / por cento) ... o THE_REQUEST contém o caractere codificado por URL, mas o caminho da URL corresponde ao padrão RewriteRule é o URL decodificado (ou seja, um espaço literal). No exemplo acima, isso significa dois padrões de expressão regular diferentes. Então, para combinar um espaço no title , você pode modificar suas regras existentes, como:

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 é modificada ligeiramente.

  • O CondPattern agora permite um caractere de porcentagem literal (ou seja, [\w%-] ).
  • O NE sinalizador é necessário no seguinte RewriteRule para evitar que o espaço codificado da URL seja duplamente codificado (por exemplo, %2520 ).
  • E o último RewriteRule requer que \s (qualquer caractere de espaço em branco) seja adicionado ao padrão . (Alternativamente, você poderia apenas usar um espaço com barra invertida, ie. \ , ou apenas um espaço e cercar o padrão entre aspas duplas.)

Isso apenas permite o espaço adicional . Embora o CondPattern agora permita qualquer percentual de caracteres codificados, o padrão RewriteRule restringe isso a espaço em branco .

UPDATE # 1: Para permitir alguns caracteres adicionais ... [\w%-] (tudo entre os colchetes) é uma classe de caracteres regex . Para permitir mais caracteres, basta adicionar 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 caracteres, já que é um meta caractere especial.

Para permitir qualquer caracteres, você pode alterar o padrão para .+ . Qual é 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]
    
por 30.12.2016 / 11:15