私は、Ruby on Rails 3.0に移植している、数百の散在するHTMLファイルと非フレームワークPHPファイルを含むサイトを継承しました。
Railsアプリに機能が追加されると、対応するページがドキュメントルートから削除されます。ただし、Googleや外部サイトからこれらへのリンクが頻繁に存在するため、404を返すだけでは受け入れられません。
たとえば、「/ contact.php」のようなURLは、「/ app /contact/」にリダイレクトする必要があります。
この最初のいくつかのケースでは、リダイレクトを実行するためのメタタグを使用して、古い場所に単純なスタブhtmlファイルを作成しました。これは、特に何千もの製品ページを置き換え始めたら、うまく拡張できません。
私の好みは、古いページを削除してから、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を透過的に呼び出したことを示します(リダイレクトを実行したり、2番目のリクエストを作成したりすることはありません)。
元のURLにアクセスするにはどうすればよいですか?
編集:明確にするために、ここに一連のイベントがあります:
- ユーザーはhttp://mysite/foo.phpのようなレガシーパスにヒットします。これは、おそらくブログの古いリンクから来ています。
- ...しかし、foo.phpはもう存在しません!
- これは404であるため、ApacheはErrorDocumentを呼び出します
- ディレクティブは「ErrorDocument404/railsapp / error/handle404」です。
- RailsはこれをErrorControllerアクション「handle404」にルーティングします-これは正しく機能しています
- 問題: ErrorControllerでは、request.request.uri、request.headersは、「/ foo.php」のように、ユーザーが実際にアクセスしようとしたURLに関する手がかりを提供しません。適切な置換ページを提供するには、元のURLを知る必要があります。