Gitのリポジトリ:https://github.com/mandongpiaoxue/apache
オリジナルの記事は、ソースを明記してください
ファイルの説明:
config.json // プロファイル images.js // SVG画像導入 server.js // サーバがファイル run.batを // 起動ファイル内のウィンドウを、サービスをすぐに開始するためにダブルクリックします
1. config.jsonの設定ファイル
{ " インデックス":" インデックス"、 // ホーム名は " 拒否":{ // IPへのアクセスの拒否 " IPS " :[ " 192.168.0.10 " ] }、 " ホスト" :[ { " ホスト":" 127.0。 0.1 " // ドメイン名の設定 " DIR ":" D:WWW /を」 // 構成パス }、 { " ホスト":" www.man.cn " 、 " DIR ":" D:/ WWW " } ] }
2. run.batファイルのコード
@cd / D%〜DP0
@echoのNode.jsサーバが正常に起動し
server.js @node
3. server.jsファイルのコードと説明
3.1モジュールとファイルを紹介します
//注入モジュール
のconstが必要とHTTP( 'HTTP' = ) のconst URLを =必要( 'URL' ) のconst FSは( 'FS'必要= ) のconstパス =( 'パス'が必要です) constのイメージ =(必要」./イメージを)//画像導入
変数定義// するvar = configと[] VAR IPS = [] VaRのインデックス= '' //設定ファイル読み込み fs.readFile(path.join(__ DIRNAME、 'ERR(config.json')を、データ)=> { 設定 = JSON.parse(data.toString()) IPS = config.deny.ips インデックス =
コンフィグ。指数 })
3.2のReadFileライト機能:私たちの約束の使用を容易にするために、簡潔なコードを書きます
関数readFileの(ファイル){ 戻り 、新たな約束((決意、リジェクト)=> { fs.readFile(ファイル、(誤り、データ) => { 場合(エラー){ 拒否(エラー) } 他{ 解決(データ) } } ) }) }
3.3サーバーのコードとNotes
HTTP .createServer(関数(REQ、RES){ / * プレゼントリモートIP * / remoteipせ(= req.socket.remoteAddress.substrを。7 ) / * シールド指定IP * / ips.forEach(IP => { IF(IP = remoteip ==)res.end( '404ファイルがNO発見!' ) }) / * ホストを取得し、すなわちドメイン名* / LETホスト = req.headers.host / * 非アクセスによるポート80は、あるでしょう場合はプロトコル、またはnullである* / LETプロトコル = url.parse(ホスト).protocol IFは、(プロトコル)ホストprotocol.slice =(0、-1 ) / * URLをフォーマットする* / LET urlObject = url.parse(req.url、真の) / * パス名を取得します* / LETのパス名 = urlObject.pathnameの パス名 = は、decodeURIComponent (パス名) / * 接尾辞を取得します* / LETのEXT = path.parse(パス名).EXT / * 対応するアクセスドメイン設定を探す* / LETサーバー = config.hosts.find((V、I)=> { 返す === v.host ホストを }) / * 読み出しパスマッチング* / IF(!Server.dir)res.end( 'ドメインはへのパスではありません!' ) Fs.readdir(server.dir、(誤り、データ) => { IF(エラー)RES。端(「エラーパスドメイン名に」) }) スイッチ(EXT){ / * の.htm .htmファイルヘッダおよび部分がHTMLまたはHTMファイルを理解しない防ぐために配置* / ケース「の.htmlを」: res.setHeader( 'タイプコンテンツ''テキスト/ HTML; = UTF-chartset 8 ' ) BREAK ケース 'の.htm ' : res.setHeader( ' Content-Typeの''テキスト/ HTML; = UTF-chartset 8 '。) 休憩 ケース '.TXT' : res.setHeader( 'Content-Typeの'、 'text / plainで、chartset = UTF-8' ) ブレーク ケース 'の.css' : res.setHeader( 'Content-Typeの'、'テキスト/ cssの。 chartset = UTF-8' ) ブレーク ケース 'の.doc' : res.setHeader( 'コンテンツタイプ'、 'アプリケーション/ mswordは、chartset = UTF-8' ) ブレーク } DIRせ = サーバー。DIR filePathには聞かせ DIR + = パス名を * / URLを形成したフォルダ/ディレクトリに読ん* / fs.readdir(filePathに、(ED、DD) => { IF (ED){ / * ファイルへの直接アクセス* / readFileの(filePathに + '' ) .then(D1 => { res.end(D1) }、E1 => { res.setHeader( 'のContent-Type'、 'テキスト/ HTML; = UTF-chartset 8' ) / * 省略の.htmの形式で文書を読む* / 戻り readFileのを(filePathに+ 'の.htm' ) }) .then(D2 => { res.end(D2) }、E2 => { / * 省略形の.htmlのファイルに読み込ま* / 戻り readFileの(filePathに+ 'の.html' ) }) .then(D3 => { res.end(D3) }、E3 => { (res.endが '404ファイルNOを発見!' ) }) } 他{ / * HTMLファイルの読み出しタイプで、設定するレスポンスヘッダ'テキスト/ HTMLを; = UTF-chartset 8' * / res.setHeader('Content-Typeの'、 'テキスト/ HTML; = UTF-chartset 8' ) / * index.htmlファイルのディレクトリを読み込む* / readFileの(filePathに + '/' +インデックス+ '.htmlを' ) .then(D1 => { res.end(D1) }、E1 => { / * index.htmファイルディレクトリ読み取る* / 戻り readFileの(filePathに+ '/' +指数+ 'の.htm' ) }) .then(D2 => { res.end(D2) }、E2 =>{ / * 読み取りインデックスファイルディレクトリ* / 戻り readFileの(filePathに+ '/' + インデックス) }) .then(D3 => { res.end(D3) }、E3 => { / * ないインデックスファイルの場合ファイル、ディレクトリが読み込まれる* / 聞かせてPNAは = pathname.split( '/' ) pna.pop() LET名 = pna.pop() LET PN = pathname.slice(0、-1 ) させPNL= pn.lastIndexOf( '/' ) しましょうupPath = pathname.slice(0、PNL + 1 ) DSましょう = ` <メタ文字コード= "UTF-8"> <タイトル> $ {名前} </ TITLE> <スタイル> 本体{パディング:20ピクセルは50px;} </スタイル> <スタイル= "表示:ブロック;高さ:32PX;" </a>のHREF = "$ {upPath}"> $ {} images.back ` dd.forEach(ファイル > = { 場合(file.search( '\\\。 DS + = `<スタイル= "表示:ブロック;高さ:32PX;" HREF = "$ {パス名+ファイル}"> <スパンスタイル= "高さ:32PX;行の高さ:32PX;フロート:左;表示:ブロック;"> $ {images.file} </スパン> <スパンスタイル= "高さ:32PX;行の高さ:32PX;フロート:左;表示:ブロック;"> $ {ファイル} </スパン> </a>の` } 他{ DS + = '<スタイル="表示:ブロック;高さ:32PX;」HREF = "$ {パス名+ファイル+ '/'}"> <スパンスタイル= "高さ:32PX;行の高さ:32PX;フロート:左;表示:ブロック;"> $ {images.folder} </スパン> <スパンスタイル= "高さ:32PX;行の高さ:32PX;フロート:左;表示:ブロック;"> $ {ファイル} </スパン>する</a> }) } }) }) .listen( 80、関数(ERR){ 場合(ERR)はconsole.log(ERR) })
図4.効果