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 seguinteRewriteRule
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]