[英]node.js serving up HTML documents in server directory
因此,我有一個非常簡單的問題,目前我的服務器文件和HTML文檔都位於同一目錄中。 但是,我已經意識到這導致了一個非常煩人的問題。 如果我要輸入:
http://localhost:3000/HTML/homepage.html
服務器為他們提供HTML文檔,通常他們必須在其中登錄並在訪問主頁之前驗證其會話ID。
有什么方法可以拒絕訪問服務器目錄中保存的文件?
我的代碼當前運行方式的示例:
var http = require('http'),
fs = require('fs');
var path = require("path");
var bodyParser = require('body-parser');
var cookieParser = require('cookie-parser')
var session = require('express-session')
var sqlite3 = require('sqlite3').verbose();
var express = require('express');
var app = express();
var server = app.listen(3000, function () {
var host = server.address().address;
var port = server.address().port;
console.log('Example app listening at http://%s:%s', host, port);
});
app.use(bodyParser());
app.use(express.static(__dirname));
app.get('/signin', function (req, res) {
res.sendFile(path.join(__dirname + '/HTML/signin'));
});
app.post('/signin', function (req, res) {
var email = req.body.email;
var password = req.body.password;
if (email!="" || password != ""){
req.session.sessID = email //using email for example purposes
res.setHeader('Content-Type', 'application/json' );
res.send(JSON.stringify({
success: true //the client then catches the JSON, and will redirect to http://localhost:3000/homepage
}));
}
}
app.get('/homepage', function(req, res){
if (req.session.sessID == undefined){
res.send("You must login first!")
}else{
res.sendFile(path.join(__dirname + '/HTML/homepage.html'));
}
}
問題的根源是:
app.use(express.static(__dirname));
這告訴Express服務它可以從下方的應用程序目錄在硬盤上找到的任何文件。 不建議這樣做。 如果在瀏覽器中輸入了正確的路徑,這甚至可以提供您的私人服務器源代碼文件。
您應該區分靜態文件和動態處理的路由,並確保它們之間沒有沖突的可能性。
常見的設計是在硬盤驅動器上為靜態HTML文件指定一個單獨的目錄(而不是您的應用程序目錄),然后在此處設置快速靜態路由。 並且,請確保您的所有動態路由都不會對靜態路由感到滿意。
例如,如果靜態HTML文件位於__dirname
目錄下的子目錄HTML
中,則可以執行以下操作:
app.use(express.static(path.join(__dirname, "HTML")));
並且,然后確保沒有任何動態HTML文件(例如homepage.html)在該目錄中(將它們放置到express.static()
永遠看不到的其他位置)。
如果您實際上不希望用戶看到除您的自定義路線以外的任何內容,請擺脫app.use(express.static(__dirname));
完全排成一行,只為您服務的每個頁面創建自定義路線。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.