Nodejs - URL de redirection


118

Comment obtenir un serveur node.js pour rediriger les utilisateurs vers une page 404.html lorsqu'ils entrent une URL non valide?

J'ai fait quelques recherches, et il semble que la plupart des résultats soient pour Express, mais je veux écrire mon serveur en pure node.js.


1
J'avais l'habitude de croire que mon application était meilleure en pure node.js, mais j'ai été TRÈS content après l'installation d'express. Je ne peux pas imaginer une architecture de service Web de nœud SPA / RESTful sans express maintenant.
— Graham

Réponses:


193

La logique de détermination d'une "mauvaise" URL est spécifique à votre application. Il peut s'agir d'une simple erreur de fichier introuvable ou de quelque chose d'autre si vous utilisez une application RESTful. Une fois que vous avez compris cela, envoyer une redirection est aussi simple que:

response.writeHead(302, {
  'Location': 'your/404/path.html'
  //add other headers here...
});
response.end();

il ne montre pas ma page html 404, peut-être que c'est juste montrer l'en-tête.
— Dzung Nguyen

7
@Magic Pas vrai. Essayez Location: /et cela vous redirigera vers le dossier racine.
— user3459110

D'accord avec Awal. J'utilise'Location': '/path/to/my/servers/content'
— Millie Smith

74

Il est possible d'utiliser:

res.redirect('your/404/path.html');

74
En express uniquement. Pas dans l'application native node.js.
— Sergey Yarotskiy

@TarunG Merci pour le commentaire, si vous regardez l'historique d'édition de la question, vous voyez que ce n'était pas toujours aussi clair.
— Daniël W. Crompton

2
Dans mon cas, res.redirect ('/ login') envoie simplement le contenu login.html dans la réponse de l'appel ajax effectué. Comment ouvrir plutôt la page?
— Tarun

Ancien message, mais peut-être cherchez-vous quelque chose comme res.direct (' localhost: 5000 / login' ), surtout si vous exécutez votre serveur express sur un port différent de celui de votre frontend, comme je le suis.
— jboxxx

18

Pour indiquer un fichier / ressource manquant et servir une page 404, vous n'avez pas besoin de rediriger. Dans la même demande, vous devez générer la réponse avec le code d'état défini sur 404 et le contenu de votre page HTML 404 comme corps de réponse. Voici l'exemple de code pour illustrer cela dans Node.js.

var http = require('http'),
    fs = require('fs'),
    util = require('util'),
    url = require('url');

var server = http.createServer(function(req, res) {
    if(url.parse(req.url).pathname == '/') {
        res.writeHead(200, {'content-type': 'text/html'});
        var rs = fs.createReadStream('index.html');
        util.pump(rs, res);
    } else {
        res.writeHead(404, {'content-type': 'text/html'});
        var rs = fs.createReadStream('404.html');
        util.pump(rs, res);
    }
});

server.listen(8080);

10

404 avec contenu / corps

res.writeHead(404, {'Content-Type': 'text/plain'});                    // <- redirect
res.write("Looked everywhere, but couldn't find that page at all!\n"); // <- content!
res.end();                                                             // that's all!

Redirection vers Http s

res.writeHead(302, {'Location': 'https://example.com' + req.url});
res.end();

Considérez simplement où vous l'utilisez (par exemple uniquement pour les requêtes http), afin de ne pas avoir de redirections interminables ;-)


7

J'ai utilisé une instruction switch, avec la valeur par défaut 404:

var fs = require("fs");
var http = require("http");

function send404Response (response){
    response.writeHead(404, {"Content-Type": "text/html"});
    fs.createReadStream("./path/to/404.html").pipe(response);
}

function onRequest (request, response){
    switch (request.url){
        case "/page1":
            //statements
            break;
        case "/page2":
            //statements
            break;
        default:
        //if no 'match' is found
            send404Response(response);
            break;
    }
}

http.createServer(onRequest).listen(8080);

5

Essaye ça:

this.statusCode = 302;
this.setHeader('Location', '/url/to/redirect');
this.end();

1
Ceci est probablement un Expressextrait de code OP demandé pour du node.jscode pur
— Refael Ackermann

Ce n'est pas du code Express. Cela ressemble au code Node vanilla sauf pour la thispartie. Dans NodeJS, vous écrivez un gestionnaire qui accepte deux paramètres (request, response)et tous ces appels dans la réponse sont sur l' responseobjet.
— AlexChaffee

1

Vous devez utiliser le code suivant:

response.writeHead(302 , {
           'Location' : '/view/index.html' // This is your url which you want
        });
response.end();

0

Utilisez le code suivant cela fonctionne très bien dans Native Nodejs

http.createServer(function (req, res) {
var q = url.parse(req.url, true);
if (q.pathname === '/') {
  //Home page code
} else if (q.pathname === '/redirect-to-google') {
  res.writeHead(301, { "Location": "http://google.com/" });
  return res.end();
} else if (q.pathname === '/redirect-to-interal-page') {
  res.writeHead(301, { "Location": "/path/within/site" });
  return res.end();
} else {
    //404 page code
}
res.end();
}).listen(8080);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.