Rails 404 обработчик для не-Rails URL - PullRequest
1 голос
/ 14 мая 2011

Я унаследовал сайт с сотнями разбросанных файлов 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-адресу?

Редактировать: чтобы уточнить, вот последовательность событий:

  1. Пользователь переходит по старому пути, например http://mysite/foo.php,, вероятно, по какой-то древней ссылке из блога.
  2. ... но foo.php больше не существует!
  3. это404, таким образом, Apache вызывает директиву ErrorDocument
  4. «ErrorDocument 404 / railsapp / error / handle404» *
  5. Rails направляет это действие ActionController «handle404» - это работает правильно
  6. проблема: в ErrorController, request.request.uri, request.headers не дают никакой подсказки относительно того, к какому URL действительно пытался добраться пользователь, например "/foo.php";Мне нужно знать исходный URL, чтобы открыть соответствующую страницу замены.

1 Ответ

0 голосов
/ 18 мая 2011

Так как я не смог найти исходный, не переписанный URL в запросе Rails, я закончил делать это на PHP - обычном, старомодном, неструктурированном PHP с явными вызовами mysqli _ * ().

Обработчик ошибок PHP получает необходимую информацию в хеше $ _SERVER; $ _SERVER ['REQUEST_URI'] содержит исходный URI, который мне нужен.

Я смотрю это в базе данных, и если я нахожу соответствующую запись, выдаю 301 редирект на новое место; если нет записи, я просто отображаю страницу 404 для пользователя.

Упрощенный (PHP):

$url = $_SERVER['REQUEST_URI'];
$redir = lookupRedirect($url);   # database stuff here
if (! $redir) {
    include ('404.phtml');
} else {
    header("Status: 301");
    header("Location: " . $redir['new_url']);
}

Это уродливый клуг, но я просто не смог найти способ заставить приложение Rails узнать об URL-адресе ошибки.

...