Я унаследовал сайт с сотнями разбросанных файлов 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 показывает только запрос для / не-существует, указывая, что он прозрачно вызван / app / error / handle404 (без doперенаправление или выполнение второго запроса).
Как получить доступ к исходному URL-адресу?
Редактировать: чтобы уточнить, вот последовательность событий:
- Пользователь переходит по старому пути, например http://mysite/foo.php,, вероятно, по какой-то древней ссылке из блога.
- ... но foo.php больше не существует!
- это404, таким образом, Apache вызывает директиву ErrorDocument
- «ErrorDocument 404 / railsapp / error / handle404» *
- Rails направляет это действие ActionController «handle404» - это работает правильно
- проблема: в ErrorController, request.request.uri, request.headers не дают никакой подсказки относительно того, к какому URL действительно пытался добраться пользователь, например "/foo.php";Мне нужно знать исходный URL, чтобы открыть соответствующую страницу замены.