Question

J'ai hérité d'un site avec des centaines de fichiers PHP HTML et non-trame de travail, que je porte sur Ruby sur Rails 3.0.

À mesure que la fonctionnalité est ajoutée dans l'application Rails, les pages correspondantes sont supprimées de la racine du document; Mais, parce qu'il y a souvent des liens vers ceux-ci dans Google ou à partir de sites externes, le simple retour d'un 404 n'est pas acceptable.

Une URL comme '/Contact.php' doit rediriger vers '/ app / contact /', par exemple.

Pour les premiers cas de cela, j'ai créé des fichiers HTML Stub simples aux anciens emplacements, avec des balises Meta à l'intérieur pour effectuer la redirection. Cela ne fait pas bien évoluer, en particulier une fois que je commence à remplacer les pages de produits, dont il y en a des milliers.

Ma préférence est de supprimer les anciennes pages, puis de faire en sorte que le Handler 404 les envoie à la nouvelle application Rails, qui examinera l'URL à l'aide de regex et de recherche de base de données pour essayer de comprendre quelle est la page de remplacement, puis émettre une redirection 301 vers cela nouvelle page.

Dans httpd.conf, j'ai placé la directive:

ErrorDocument 404 /app/error/handle404
# /app/error is a rails url.

Lorsque j'ai atteint "http: // localhost / ne-not-exist", cela provoque l'invoquer mon Contrôle d'erreur, comme prévu.

Cependant, au sein du contrôleur, je ne trouve pas le chemin d'origine ("/ / ne-not-exist") n'importe où dans Request, request.headers, ou env - J'ai appelé des méthodes probables comme request.request_uri (qui contient / app / error / manche404), et examinant la demande.headers et env sans trouver le chemin d'origine attendu.

L'Apache Access_log affiche uniquement la demande / ne fait pas-existant, indiquant qu'il a invoqué de manière transparente / app / error / manche404 (sans faire de redirection ou provoquer une deuxième demande).

Comment puis-je avoir accès à l'URL d'origine?

Edit: Pour clarifier, voici la séquence des événements:

  1. L'utilisateur frappe le chemin de l'héritage comme http: //mysite/foo.php, provenant probablement d'un lien ancien d'un blog.
  2. ... mais foo.php n'existe plus!
  3. Ceci est un 404, ainsi Apache invoque Errordocument
  4. La directive est "Errordocument 404 / Railsapp / Error / Handle404"
  5. Rails le roule vers l'action ErrorController "Handle404" - cela fonctionne correctement
  6. problème: Dans ErrorController, request.request.uri, request.headers ne fournit aucun indice quant à quelle URL l'utilisateur essayait réellement de se rendre, comme "/foo.php"; J'ai besoin de connaître l'URL d'origine pour servir une page de remplacement appropriée.
Était-ce utile?

La solution

Comme je n'ai pas pu trouver l'URL originale et non réprimandée dans la demande de rails, j'ai fini par le faire en PHP - PHP à l'ancienne et à l'ancienne avec des appels explicites MySqli _ * ().

Le gestionnaire d'erreurs PHP reçoit les informations nécessaires dans le hachage $ _Server; $ _Server ['request_uri'] contient l'URI d'origine dont j'avais besoin.

Je recherche cela dans une base de données, et si je trouve une entrée correspondante, émettez une redirection 301 vers le nouvel emplacement; S'il n'y a pas d'entrée, j'affiche simplement une page 404 à l'utilisateur.

Simplifié (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']);
}

C'est un laid Kluge, mais je ne pouvais tout simplement pas trouver un moyen de faire prendre conscience de l'application Rails de l'URL d'erreur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top