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

Правила перезаписи Apache и специальные символы

У меня есть сервер, на котором некоторые файлы имеют актуальный %20 в их имени (они создаются автоматическим инструментом, который обрабатывает пробелы таким образом, и я ничего не могу с этим поделать); это не пробел: это «%», за которым следует «2», за которым следует «0».

На этом сервере есть веб-сервер Apache, и есть несколько веб-страниц, которые ссылаются на эти файлы, используя их имена в URL-адресах, например http://servername/file%20with%20a%20name%20like%20this.html; эти страницы также генерируется тем же инструментом, поэтому я (опять же!) ничего не могу с этим поделать. Здесь не может быть и речи о полном поиске и замене всех файлов, страниц и URL-адресов.

Проблема: когда Apache вызывается с URL-адресом, подобным указанному выше, он (правильно) переводит "% 20" в пробелы, а затем, конечно, он не может найти файлы, потому что у них нет фактических пробелы в их именах.

Как я могу это решить?

Я обнаружил, чем с помощью URL-адреса, например http://servername/file%2520name.html это работает хорошо, потому что тогда Apache переводит "% 25" в знак "%", и, таким образом, создается правильное имя файла.

Я пробовал использовать правило перезаписи Apache, и я могу успешно заменить пробелы на дефисы с таким синтаксисом:

RewriteRule    (.*)\ (.*)      $1-$2

Проблема: когда я пытаюсь заменить их последовательностью «% 2520», этого просто не происходит. Если я использую

RewriteRule    (.*)\ (.*)      $1%2520$2

тогда результирующий URL-адрес http://servername/file520name.html; Я тоже пробовал «% 25», но потом получил только «5»; просто похоже, что начальный "% 2" несколько отброшен.

Вопросы:


Редактировать:

Ключевым моментом было экранирование, оно работает по следующему правилу:

RewriteRule    (.*)\ (.*)      $1\%2520$2

Но это работает, только если есть один «% 20» в исходном URL-адресе; Я получаю «внутреннюю ошибку сервера», если их несколько.

Похоже, я почти там ... помогите пожалуйста :-)


Изменить 2:

Я смог заставить его работать на два пробелы, используя следующее правило:

RewriteRule    (.*)\ (.*)\ (.*)     $1\%2520$2\%2520$3

Этого достаточно для моих нужд, так как URL-адреса, сгенерированные инструментом, могут содержать не более двух "% 20"; но из любопытства: есть ли способ заставить эту работу работать с любым количеством пробелов? Он работает с первым правилом при замене любого количества пробелов обычным символом, эта проблема возникает только при использовании специальных символов.

% Читается как обратная ссылка, поэтому вам нужно избегать%.