Назад | Перейти на главную страницу

Как перенаправить URL-адрес, в котором есть место

Я перенаправляю с этого URL

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

на этот URL

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

Использование этих правил перезаписи 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]

Но если в URL есть пространство в нем например

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

Тогда указанное выше правило работать не будет. Как я могу заставить этот URL работать с упомянутым выше правилом, только используя .htaccess?

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

Немного побочный вопрос, но вам не хватает пространство перед RewriteRule флаги, которые приведут к ошибочной перезаписи. Так должно быть: ...&title=$2 [R=301,L].

Касаемо символа пробела (%20 при кодировании URL / процентов) ... THE_REQUEST содержит символ в кодировке URL, но путь URL совпадает с RewriteRule шаблон декодируется URL (т. е. буквальный пробел). В приведенном выше примере это означает два разных шаблона регулярных выражений. Итак, чтобы соответствовать пространство в title вы можете изменить существующие правила примерно так:

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]

Каждая директива немного изменена.

  • В CondPattern теперь позволяет использовать буквальный символ процента (т.е. [\w%-]).
  • В NE флаг требуется на следующих RewriteRule чтобы предотвратить двойное кодирование пространства, закодированного в URL (например, %2520).
  • И последнее RewriteRule требует \s (любой пробельный символ) добавляется к шаблон. (В качестве альтернативы вы можете просто использовать экранированный пробел с обратной косой чертой, т.е. \, или просто пространство и окружить весь шаблон в двойных кавычках.)

Это просто разрешает дополнительные пространство. Хотя CondPattern теперь позволяет любой символ, закодированный в процентах, RewriteRule шаблон ограничивает это пробел.


ОБНОВЛЕНИЕ №1: Позволять некоторые дополнительные символы ... [\w%-] (все в квадратных скобках) является регулярным выражением класс персонажа. Чтобы разрешить больше символов, вы просто добавляете эти символы в класс символов. например. В случае ,, ' и ;, это становится [\w%,';-]. Обратите внимание, что дефис (-) должен стоять в начале или в конце класса символов, поскольку это специальный метасимвол.

Позволять любой символы, то вы можете изменить узор на .+. Это просто 1 или несколько символов. Точка указывает любой персонаж. Итак, это станет:

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]