用于非Rails URL的Rails 404处理程序

时间:2011-05-14 19:24:45

标签: ruby-on-rails apache2 errordocument

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

随着Rails应用程序中添加功能,相应的页面将从文档根目录中删除;但是,由于Google或外部网站经常会链接到这些内容,因此只接回404即可。

例如,像'/contact.php'这样的网址应该重定向到'/ 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.headers或ENV中的任何地方的原始路径(“/不存在”) - 我一直在调用可能的方法,如request.request_uri(其中包含/ app / error / handle404),检查request.headers和ENV而没有找到预期的原始路径。

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

如何访问原始网址?

编辑:澄清一下,这是一系列事件:

  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”;我需要知道原始网址才能提供适当的替换页面。

1 个答案:

答案 0 :(得分:0)

由于我在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']);
}

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