Cómo redirigir una URL que tiene espacio en ella

Dec 30 2016

Estoy redireccionando desde esta URL

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

a esta URL

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

Usar estas reglas de reescritura 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]

Pero si la URL tiene un espacio , por ejemplo

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

Entonces la regla anterior no funcionará. ¿Cómo puedo hacer que esta URL funcione solo con la regla mencionada anteriormente .htaccess?

Respuestas

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

Es un problema secundario, pero le falta un espacio antes de las RewriteRulebanderas, lo que resultará en una reescritura errónea. Debe ser: ...&title=$2 [R=301,L].

Con respecto al carácter de espacio ( %20cuando la URL / porcentaje está codificado) ... THE_REQUESTcontiene el carácter codificado de la URL, pero la ruta de la URL que coincide con el RewriteRule patrón es la URL decodificada (es decir, un espacio literal). En el ejemplo anterior, esto significa dos patrones de expresiones regulares diferentes. Entonces, para hacer coincidir un espacio en el title, puede modificar sus reglas existentes de la siguiente manera:

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 directiva se modifica ligeramente.

  • El CondPattern ahora permite un carácter de porcentaje literal (es decir. [\w%-]).
  • La NEmarca es necesaria en lo siguiente RewriteRulepara evitar que el espacio codificado en URL se codifique doble (por ejemplo %2520).
  • Y el último RewriteRulerequiere que \sse agregue (cualquier carácter de espacio en blanco) al patrón . (Alternativamente, puede usar un espacio de escape de barra invertida, es decir \, o simplemente un espacio y rodear todo el patrón entre comillas dobles).

Esto solo permite el espacio adicional . Aunque CondPattern ahora permite cualquier carácter codificado en porcentaje, el RewriteRulepatrón lo restringe a espacios en blanco .


ACTUALIZACIÓN # 1: Para permitir algunos caracteres adicionales ... [\w%-](todo entre los corchetes) es una clase de carácter regex . Para permitir más caracteres, simplemente agregue estos caracteres a la clase de caracteres. p.ej. En el caso de ,, 'y ;, esto se convierte en [\w%,';-]. Tenga en cuenta que el guión ( -) debe aparecer al principio o al final de la clase de carácter, ya que es un metacarácter especial.

Para permitir cualquier carácter, puede cambiar el patrón a .+. Que es simplemente 1 o más caracteres. El punto indica cualquier carácter. Entonces, esto se convertiría en:

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]