Что я пытаюсь достичь
Учитывая URL верхнего уровня, такой как http://www.myapp.com/
Если кто-то просит:
http://www.myapp.com/questions/id/1
Я хочу получить часть "questions / id / 1" и передать ее соответствующему сценарию Perl для получения требуемого ресурса.
Что я достиг
В настоящее время я знаю, как это сделать, если в URL есть дополнительный уровень, например:
http://www.myapp.com/model/questions/id/1
Где «модель» - это просто типичный CGI-скрипт Perl, за исключением того, что он не имеет расширения «.pl», и обработчик perl Apache настроен для обработки этого, а часть «questions / id / 1» интерпретируется как путь информация (через CGI-> path_info ()) передается в "модель".
Я пришел к этой идее из статьи Эндрю Ханенкампа по теме на onlamp.com
Разработка веб-сервисов RESTful на Perl
Что еще не так
Этот подход, однако, не работает для URL верхнего уровня, так как нет места для добавления "модель" или как там называется обработчик. Я попытался установить настройки документов по умолчанию в конфигурации, чтобы http://www.myapp.com/ по умолчанию http://www.myapp.com/modle.
Так что набор http://www.myapp.com/questions/id/1 обрабатывается как http://www.myapp.com/model/questions/id/1
Однако Apache считает, что это ошибка 404.
Как мне это сделать? Это даже работа для Perl или лучше выполняется на уровне конфигурации Apache или, может быть, используется какой-то API-интерфейс Apache, чтобы отлавливать ошибки 404 и извлекать часть "/ questions / id / 1" оттуда? Я не знаю. Может быть, кто-то здесь знает. ; -)
Примечание: Извините за длинный и окольный способ задать этот вопрос. Я не совсем уверен, какая терминология требуется, чтобы получить ответ по теме. Упоминание четырехбуквенного слова, начинающегося с R и заканчивающегося буквой T при задании этого вопроса ранее здесь и в других местах, привело к горячим дискуссиям о природе сказанного для буквенного слова, а также о значительных, но бесполезных предложениях использовать ту или иную структуру. Мне просто интересно узнать, как эти фреймворки реализуют эту функцию, и я хочу реализовать ее в Perl, чтобы узнать, как это сделать.
Обновление:
Один из предложенных ответов побудил меня попробовать mod_rewrite. Работает. Тем не менее, довольно непрактично устанавливать Apache conf вручную для каждого отображения. Дальнейшие поиски позволили мне перейти к книге О'Рейли "Practical mod_perl". В нем Бекман и Шоле писали о программном доступе к mod_rewrite через пакет Apache CPAN для установки перезаписи. Приложение 10: "mod_rewrite in Perl" Написание кода для проверки идеи этой книги. А пока, если есть лучшие способы сделать это, пожалуйста, поделитесь.
Заключение
После создания прототипа двух сценариев маршрутизации / диспетчеризации Uri (или Whatchamacallit), один полагается на mod_rewrite, чтобы вызвать его, а другой на ErrorDocument; Я пришел к выводу, что mod_rewrite является правильным способом реализации этого.
Метод ErrorDocument является неправильным, поскольку он не сохраняет данные POST с перенаправленной страницы.
Не нужно отправлять запрос POST на http://www.myapp.com/questions для создания нового ресурса, поскольку данные POST недоступны для пользовательского сценария обработчика ошибок, вызываемого ErrorDocument. Кроме того, поскольку каждый запрос по определению не будет обращаться к физическому файлу, таким образом, журнал ошибок Apache будет полон ошибок spurios 404 file not found. Это может быть огромной проблемой, если объем транзакций на сервере высок. Спасибо всем за то, что указали мне правильное направление. Теперь мое любопытство утолено.