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

Используйте информацию о пути вместе с RewriteRule

У меня есть устаревшее приложение, которое я хочу обернуть в новый проект Symfony. Чтобы четко разделить вещи, я решил переместить все устаревшее приложение в папку legacy который находится вне корня документа.

Поскольку некоторые из унаследованных скриптов по-прежнему следует вызывать напрямую, я создал псевдоним и написал RewriteRule:

Alias /legacy_public "C:\project_root\legacy\public"

RewriteEngine On
  RewriteCond %{DOCUMENT_ROOT}/../legacy/public%{REQUEST_URI}  -f
  RewriteRule ^(.*)$  /legacy_public$1 [PT,L]
[...]

Это работает, пока нет информации о пути. Например, вызов URL www.example.org/showLogo.php правильно проверяет, существует ли файл, перезаписывает URL-адрес и выполняет сценарий.

Однако для правильной работы сценарий ожидает некоторые данные о пути. При звонке www.example.org/inc/showLogo.php/38 указанный выше RewriteCond не соответствует, потому что нет файла с именем showLogo.php/38.

После изучения документации мне неясно, как мне изменить условие, чтобы перед тестированием отбросить path_info-Part -f

Вы могли бы быть более строгими в своих RewriteRule шаблон таким образом, чтобы создать обратную ссылку, которая исключает информацию о пути, сопоставляя только до и включая расширение файла и используя полный URL-путь (т.е. REQUEST_URI) в замена вместо.

Например:

RewriteCond %{DOCUMENT_ROOT}/../legacy/public$1  -f
RewriteRule ^(.+\.php)  /legacy_public%{REQUEST_URI} [PT,L]

В $1 обратная ссылка в RewriteCond TestString то соответствует только upto включительно .php, отбрасывая оставшуюся часть URL-пути.

Предположительно у вас также есть другие статические ресурсы (JS, CSS и изображения), которые вам также необходимо переписать, чтобы вы могли включить их в приведенное выше регулярное выражение:

RewriteRule ^(.+\.(?:php|js|css|jpg|png))  /legacy_public%{REQUEST_URI} [PT,L]

ИЛИ используйте другое правило «поймать все», как вы это делали изначально (которое не предполагает никакой информации о пути).

Это предполагает, что у вас нет законных URL-адресов, содержащих то, что «похоже» на промежуточный URL-адрес расширения файла (маловероятно).