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

htaccess - Как учесть пробелы при использовании буквального обозначения?

Если у меня есть 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]