1

我继承了一个包含数百个分散的 HTML 和非框架 PHP 文件的站点,我将其移植到 Ruby on Rails 3.0。

在 Rails 应用程序中添加功能时,相应的页面会从文档根目录中删除;但是,由于 Google 或外部站点中经常有这些链接,因此不能接受简单地返回 404。

例如,像“/contact.php”这样的 URL 应该重定向到“/app/contact/”。

对于前几个案例,我在旧位置创建了简单的存根 html 文件,其中包含 Meta 标记以执行重定向。这不能很好地扩展,特别是当我开始替换产品页面时,其中有数千个。

我的偏好是删除旧页面,然后让 404 处理程序将它们发送到新的 Rails 应用程序,该应用程序将使用正则表达式和数据库查找检查 URL 以尝试找出替换页面是什么,然后发出 301 重定向到那个新页面。

在 httpd.conf 中,我放置了指令:

ErrorDocument 404 /app/error/handle404
# /app/error is a rails url.

当我点击“http://localhost/does-not-exist”时,这会导致我的 ErrorController 按预期被调用。

但是,在控制器中,我在 request、request.headers 或 ENV 中的任何地方都找不到原始路径(“/does-not-exist”)——我一直在调用可能的方法,例如 request.request_uri(其中包含 /app/ error/handle404),并检查 request.headers 和 ENV 却没有找到预期的原始路径。

Apache access_log 仅显示对 /does-not-exist 的请求,表明它透明地调用了 /app/error/handle404(没有进行重定向或导致进行第二次请求)。

如何访问原始 URL?

编辑:澄清一下,这是事件的顺序:

  1. 用户点击像 http://mysite/foo.php 这样的遗留路径,可能来自博客中的一些古老链接。
  2. ...但是 foo.php 不再存在!
  3. 这是 404,因此 Apache 调用 ErrorDocument
  4. 指令是“ErrorDocument 404 /railsapp/error/handle404”
  5. Rails 将此路由到 ErrorController 操作“handle404” - 这工作正常
  6. 问题:在 ErrorController 中,request.request.uri、request.headers 没有提供任何关于用户实际尝试访问哪个 URL 的线索,例如“/foo.php”;我需要知道原始 URL 以提供适当的替换页面。
4

1 回答 1

0

由于我在 Rails 请求中找不到原始的、未重写的 URL,我最终在 PHP 中完成了它 - 带有显式 mysqli_*() 调用的普通、老式、非框架 PHP。

PHP 错误处理程序在 $_SERVER 散列中接收必要的信息;$_SERVER['REQUEST_URI'] 包含我需要的原始 URI。

我在数据库中查找,如果找到相应的条目,则发出 301 重定向到新位置;如果没有条目,我只是向用户显示一个 404 页面。

简化(PH​​P):

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

这是一个丑陋的 kluge,但我只是找不到让 Rails 应用程序知道错误 URL 的方法。

于 2011-05-18T16:28:20.093 回答