Я перенаправляю с этого 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]
Каждая директива немного изменена.
[\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]