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.

Dzung Nguyen
la source
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();
Chetan S
la source
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');
Daniël W. Crompton
la source
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);
Chandra Sekar
la source
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 vous l'utilisez (par exemple uniquement pour les requêtes http), afin de ne pas avoir de redirections interminables ;-)

lévite
la source
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);
Alon et Idan
la source
5

Essaye ça:

this.statusCode = 302;
this.setHeader('Location', '/url/to/redirect');
this.end();
Mike
la source
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();
Arash Keivan
la source
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);
Krishnamoorthy Acharya
la source