Я унаследовал сайт с сотнями разбросанных файлов HTML и PHP, не относящихся к фреймворку, которые я переношу на Ruby on Rails 3.0.
По мере добавления функциональности в приложение Rails соответствующие страницы удаляются из корня документа; но, поскольку на них часто есть ссылки в Google или на внешних сайтах, простой возврат 404 недопустим.
Например, URL-адрес типа «/contact.php» должен перенаправлять на «/app/contact/».
Для первых нескольких случаев я создал простые html-файлы-заглушки в старых местах с метатегами внутри для выполнения перенаправления. Это плохо масштабируется, особенно когда я начинаю заменять страницы продуктов, которых тысячи.
Я предпочитаю удалить старые страницы, а затем отправить их обработчику 404 в новое приложение Rails, которое проверит URL-адрес с помощью регулярных выражений и поиска в базе данных, чтобы попытаться выяснить, что представляет собой замещающая страница, а затем выполнит перенаправление 301 на это. новая страница.
В httpd.conf я разместил директиву:
ErrorDocument 404 /app/error/handle404
# /app/error is a rails url.
Когда я нажимаю «http://localhost/does-not-exist», это вызывает вызов моего ErrorController, как и ожидалось.
Однако внутри контроллера я не могу найти исходный путь («/не существует») в запросах, request.headers или ENV — я вызывал вероятные методы, такие как request.request_uri (который содержит /app/ error/handle404) и изучение request.headers и ENV без нахождения ожидаемого исходного пути.
Apache access_log показывает только запрос /does-not-exist, указывая на то, что он прозрачно вызвал /app/error/handle404 (без перенаправления или создания второго запроса).
Как я могу получить доступ к исходному URL?
Изменить: чтобы уточнить, вот последовательность событий:
- Пользователь переходит по устаревшему пути, например http://mysite/foo.php, возможно, по какой-то древней ссылке из блога.
- ... но foo.php больше не существует!
- это 404, поэтому Apache вызывает ErrorDocument
- директива "ErrorDocument 404 /railsapp/error/handle404"
- Rails направляет это в действие ErrorController "handle404" - это работает правильно
- проблема: в ErrorController, request.request.uri, request.headers не дают никаких сведений о том, какой URL-адрес на самом деле пытался получить пользователь, например "/foo.php"; Мне нужно знать исходный URL-адрес, чтобы обслуживать соответствующую страницу замены.