2014-08-29 53 views
1

我試圖做一個簡單的301重定向。我的代碼看起來是這樣的:使用express和node.js重定向301 GET不被稱爲

app.get('/',function(req,res){ 
    console.log(req.get('host')+req.originalUrl); 
    if(req.get('host')+req.originalUrl == "facebook.com:3000/"){ 
    res.redirect(301,'https://youtube.com'); 
    } else { 
    res.redirect(301,'https://google.com'); 
    } 
}); 

所以我做了什麼是編輯我的主機文件,以便facebook.com被鏈接到本地​​主機(127.0.0.1) 問題是我的app.get()沒有被稱爲除幾次(通常當我不看app.js文件一段時間,然後再次使用它)。在那些時間之後,即使我編輯文件重定向到其他網站,它也會始終重定向到同一網站。這裏是另外一些相關的代碼如下:

app.locals.cacheBuster = Date.now(); 
app.set('port', process.env.PORT || argv.p || 3000); 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'jade'); 
app.use(express.compress()); 
app.use(express.favicon(path.join(__dirname, 'public/img/favicon.ico'))); 
app.use(express.logger('dev')); 
app.use(express.cookieParser()); 
app.use(express.json()); 
app.use(express.urlencoded()); 
app.use(expressValidator()); 
app.use(express.methodOverride()); 
app.use(express.session({ 
    secret: 'your secret code', 
    store: new MongoStore({ 
    db: mongoose.connection.db, 
    auto_reconnect: true 
    }) 
})); 
app.use(passport.initialize()); 
app.use(passport.session()); 
app.use(function(req, res, next) { 
    res.locals({ 
    user: req.user, 
    cookies: req.cookies, 
    pullup: { // global client-side JS object 
     baseUrl: req.protocol + '://' + req.get('host') 
    } 
    }); 

    if (!_.isObject(req.session.flash) || !Object.keys(req.session.flash).length) { 
    req.session.windowscrolly = 0; 
    } 
    if (req.body.windowscrolly) req.session.windowscrolly = req.body.windowscrolly; 
    res.locals.windowscrolly = req.session.windowscrolly; 
    res.setHeader("Content-Security-Policy", "script-src 'self' https://apis.google.com http://sysinct.herokuapp.com; frame-src 'self' https://gitter.im;"); 
    res.setHeader("X-Frame-Options", "DENY"); 
    next(); 
}); 

app.use(flash()); 

app.use(less({ src: __dirname + '/public', compress: true })); 

app.use(app.router); 

app.use(express.static(path.join(__dirname, 'public'), { maxAge: week })); 

app.use(function(req, res) { 
    res.render('404', { status: 404 }); 
}); 

app.use(function(err, req, res, next){ 
    console.error("req: "+req +"\nerror:"+err.stack); 
    res.statusCode = 500; 
    res.render('error',{error:err}); 
}); 

app.locals.timeago = timeago; 

...最終,

app.listen(app.get('port'), function() { 
    console.log("✔ Express server listening on port %d in %s mode", app.get('port'), app.settings.env); 
}); 

我試着將我的app.get功能爲解決此塊的代碼我不同的地方(」我知道我不會把app.get()放在這個例子中,因爲我不知道該把它放在哪裏),因爲我讀到它與app.use(app.router)和其他中間件有關的順序,但是我沒有找到原因app.get()未被調用。

  1. 我想知道爲什麼app.get()不會被調用
  2. 如果我重定向的方式是正確的。 謝謝!

回答

0

對於301重定向,chrome瀏覽器將301重定向的信息存儲在緩存中(以便服務器可以在將來加載數據的速度更快)。所以我的app.get沒有被調用,因爲緩存提供了一個本地化版本的網頁,而不是再次從服務器請求。 要使其工作,請清除設置中的緩存(瀏覽歷史記錄的位置)。然後,它會通過向Web服務器請求重定向,並調用app.get()。

0

你在最上面的設置:

var express = require('express'); 
var app = express(); 

我才知道曾經工作像

var bodyParser = require('express.bodyParser()');

但不再,現在是由快遞分離,我看到你有這樣的幾個模塊,想不出是什麼?

+0

是的,我把快遞放在最上面。你能否詳細說明你的第二條評論?感謝您的幫助。 – vvayne 2014-08-30 02:27:31

+0

明白了。不是一個明確的問題,而是瀏覽器緩存。 – vvayne 2014-08-30 16:57:22