我继承了一个包含数百个分散的 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?
编辑:澄清一下,这是事件的顺序:
- 用户点击像 http://mysite/foo.php 这样的遗留路径,可能来自博客中的一些古老链接。
- ...但是 foo.php 不再存在!
- 这是 404,因此 Apache 调用 ErrorDocument
- 指令是“ErrorDocument 404 /railsapp/error/handle404”
- Rails 将此路由到 ErrorController 操作“handle404” - 这工作正常
- 问题:在 ErrorController 中,request.request.uri、request.headers 没有提供任何关于用户实际尝试访问哪个 URL 的线索,例如“/foo.php”;我需要知道原始 URL 以提供适当的替换页面。