我继承了一个包含数百个分散的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(没有进行重定向或导致第二次请求)。
如何访问原始网址?
编辑:澄清一下,这是一系列事件:
答案 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的方法。