Nodejs-リダイレクトURL


118

ユーザーが無効なURLを入力したときに、node.jsサーバーがユーザーを404.htmlページにリダイレクトする方法を教えてください。

私はいくつかの検索を行いましたが、ほとんどの結果はExpressに対するもののようですが、サーバーを純粋なnode.jsで記述したいと思います。


1
私は自分のアプリが純粋なnode.jsの方が優れていると信じていましたが、expressをインストールした後はとても満足しています。私は今、明示せずにノードのSPA / RESTful Webサービスアーキテクチャを想像することはできません。
— グラハム、

回答:


192

「間違った」URLを判別するロジックは、アプリケーションに固有です。RESTfulアプリを実行している場合は、単純なファイルが見つかりませんというエラーまたは何か他の可能性があります。それがわかったら、リダイレクトの送信は次のように簡単です。

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

それは私の404 HTMLページを表示しません、おそらくそれは単にヘッダーを表示しているだけです。
— Dzung Nguyen、

7
@マジック真実ではない。試してみるLocation: /と、ルートフォルダーにリダイレクトされます。
— user3459110 2014年

アワルに同意した。私が使用しています'Location': '/path/to/my/servers/content'
— ミリー・スミス

73

使用することが可能です:

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

73
エクスプレスのみ。ネイティブのnode.jsアプリにはありません。
— Sergey Yarotskiy 14

@TarunGコメントをありがとうございます。質問の編集履歴を見ると、これが必ずしも明確ではなかったことがわかります。
— ダニエルW.クロンプトン2015

2
私の場合、res.redirect( '/ login')は、行われたajax呼び出しの応答でlogin.htmlコンテンツを送信するだけです。ページを開くにはどうすればよいですか?
— 2016年

古い投稿ですが、おそらくあなたがres.direct( ' localhost:5000 / login')のようなものを探しているのかもしれません。
— jboxxx '20年

18

不足しているファイル/リソースを示し、404ページを提供するために、リダイレクトする必要はありません。同じリクエストで、ステータスコードを404に設定し、404 HTMLページのコンテンツをレスポンス本文として生成する必要があります。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

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!

HTTPのリダイレクト先の

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

これをどこで使用するかを検討するだけで(たとえば、httpリクエストのみ)、無限のリダイレクトが発生しないようにしてください;-)


7

デフォルトは404として、switchステートメントを使用しました。

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

これを試して:

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

1
これはおそらく、Express純粋なnode.jsコードを要求するコードスニペットOP です
— Refael Ackermann

これはExpressコードではありません。これは、thisパーツを除いてバニラノードコードのように見えます。NodeJSで、2つのパラメーターを受け入れるハンドラーを記述(request, response)し、応答内のそれらすべての呼び出しはresponseオブジェクト上にあります。
— AlexChaffee

1

次のコードを使用する必要があります。

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

0

これはネイティブ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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.