【问题标题】:Rails 404 handler for non-Rails URLs用于非 Rails URL 的 Rails 404 处理程序
【发布时间】:2011-08-25 15:30:56
【问题描述】:

我继承了一个站点,其中包含数百个分散的 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 才能提供适当的替换页面。

【问题讨论】:

  • 你的 Q 有点冗长,我真的不明白你在问什么。在 rails 路由中,您可以匹配通配符路由,但这不是 ruby​​-on-rails 问题,即使它被标记为一个?
  • rails 路由按预期工作;但 Rails 只回答以“/app”开头的 uris。在该虚拟目录之外是一个 PHP 应用程序,它正在慢慢迁移到 Rails,一次一个。我希望 404 处理程序回答丢失的 PHP 文件,通过“ErrorDocument 404 /app/error/handle404”将这些文件发送到 Rails。这可行 - 除了当 ErrorController 操作 handle404 实际运行时,它无法看到原始 URL 是什么,因此无法弄清楚如何处理丢失的页面。
  • rails 应用可以做什么?谁负责提供信息,php 和/或 apache?如果我要花更多时间在上面,我建议你重写问题并拥有更多代码和配置。
  • rails 应用程序必须检查原始的、pre-ErrorDocument URL,然后适当地路由它(使用正则表达式、数据库查找等,以确定要做什么)。问题是我无法访问此 URL(可能类似于 /does-not-exist.php); rails 应用程序只能看到它自己的 post-ErrorDocument URL。

标签: ruby-on-rails apache2 errordocument


【解决方案1】:

由于我在 Rails 请求中找不到原始的、未重写的 URL,我最终使用 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 的方法。

【讨论】:

    猜你喜欢
    • 2012-01-26
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 2010-10-31
    • 2011-08-02
    相关资源
    最近更新 更多