簡體   English   中英

node.js在服務器目錄中提供HTML文檔

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM