Если у меня есть URL root.com/index rel
который кодируется в root.com/index%20rel
как мне настроить таргетинг с помощью буквальной нотации htaccess?
=
обозначает буквальную нацию. Так я делаю что-то вроде этого
RewriteCond %{REQUEST_URI} =index rel
RewriteRule .* / [L,R=302,]
Но htaccess считает, что пространство делает вещи дополнительным параметром, а не частью того же параметра.
Бегство не работает
При использовании лексикографического / буквального сравнения (т.е. =
оператор) вы можете окружить весь CondPattern в двойных кавычках, если строка содержит пробел. Например:
RewriteCond %{REQUEST_URI} "=index rel"
(The REQUEST_URI
переменная уже декодирована в процентах.)
Однако это условие по-прежнему не будет соответствовать, поскольку REQUEST_URI
переменная начинается с косой черты (в отличие от URL-пути, который соответствует RewriteRule
шаблон). Итак, вам понадобятся:
RewriteCond %{REQUEST_URI} "=/index rel"
Но, как предлагает Unbeliever, если возможно, вы должны сопоставить этот URL-путь в RewriteRule
шаблон вместо этого (который вы также можете заключить в двойные кавычки, если предпочитаете этот синтаксис). В RewriteRule
шаблон обрабатывается первым, поэтому более эффективно делать то, что вы можете там, вместо сопоставления URL-пути в состояние.
ОБНОВИТЬ: Рабочий пример, протестированный на Apache 2.2 (Windows и Linux) и Apache 2.4 (Windows):
RewriteCond %{REQUEST_URI} "=/foo bar"
RewriteRule ^ /baz [R=302,L]
Запрос на /foo%20bar
перенаправлен на /baz
.
Я почти уверен, что у вас не может быть пробела в целевом шаблоне при использовании лексических сравнений (в отличие от PCRE), поскольку я думаю, что «экранирование» - это то, что интерпретирует PCRE. Также вам не нужен RewriteCond
так как RewriteRule
совпадает с URI запроса. Вместо этого используйте следующее:
RewriteRule ^index\ rel$ / [L,R=302]