1. 程式人生 > 其它 >總結URL路徑學習記錄(易混淆)補充之前的記錄

總結URL路徑學習記錄(易混淆)補充之前的記錄

技術標籤:javascripthtmlhtml5url

容易混淆路徑,和開了本地伺服器後的瀏覽器位址列地址,查了資料後再自己驗證後總結如下
測試檔案所在目錄如下
D:\develop-tools\code\nodeExercise\urlTest\first\second\2-1.html
D盤等太往上的目錄vscode沒顯示,我直接寫出來,以下是截圖
在這裡插入圖片描述
以下為2-1.html中測試的程式碼,結果都寫在各個a標籤上的註釋裡,結尾有總結

    <!-- 分為直接開啟和用localhost伺服器開啟兩種情況 -->

    <!-- 1.直接開啟--可以訪問; 2.localhost開啟--
可以訪問 --> <a href="2-2.html">沒斜槓</a> <!-- 1.直接開啟--可以訪問; 2.localhost開啟--可以訪問 --> <a href="./2-2.html">單斜槓前有一點</a> <!-- 1.直接開啟結果顯示的是電腦的D盤索引,而不是IDE的根目錄,因為2-1.html存在於D--> <!-- 2.localhost開啟什麼也不顯示,但是網頁能順利載入,不會一直轉圈圈,因為沒有設定錯誤地址路由的響應 所以就算我輸入.
/2-3.htmlss,都不會顯示出錯 所以後續加了錯誤顯示,結果是目標檔案不能訪問到 --> <a href="/">就只有一個單斜槓,沒有其他路徑</a> <!-- 1.直接開啟D盤為根目錄可以訪問 --> <!-- 2.localhost開啟,不能訪問,因為已經拼接了絕對路徑,這樣重複了,查詢不到 --> <a href="/develop-tools/code/nodeExercise/urlTest/first/second/2-2.html">D
盤為根目錄開始查詢2-2</a> <!-- 1.直接開啟--無法訪問; 2.localhost開啟--可以訪問 --> <a href="/first/1-1.html">單斜槓,假設以urlTest為根目錄,查詢1-1</a> <!-- 1.直接開啟--無法訪問; 2.localhost開啟--無法訪問 --> <a href="/nodeExercise/urlTest/first/1-1.html">單斜槓,以IDE最外層為根目錄查詢1-1</a> <!-- 1.直接開啟--可以訪問; 2.localhost開啟--可以訪問 --> <a href="../1-1.html">兩點加單斜槓</a> <!-- 1.直接開啟--可以訪問; 2.localhost開啟--可以訪問 --> <a href="../../0-1.html">多次兩點加單斜槓網上級走,查詢0-1</a> <!-- 總結 --> <!-- localhost:3000或者http://localhost:3000 實際上訪問的是以D盤為根目錄的D:\develop-tools\code\nodeExercise\urlTest --> <!-- 1.****** 本檔案右鍵直接開啟的話,根目錄是D盤,即檔案所處磁碟,已經不能在往上繼續查詢上一級了 2.****** 如果用locahost本地伺服器開啟,的話,需要引入一堆模組 比如http,fs,path,url http來建立伺服器,url解析在瀏覽器中輸入的地址 path.join方法把地址和__dirname拼接成絕對路徑, fs再來載入驗證是否能讀取到目標檔案 所以原理上都是訪問到絕對路徑,只不過自己平時犯糊塗的時候把拼接地址忘記了 而且絕對路徑都是該檔案下的根磁碟開始的 在沒有引入express框架,用中介軟體和static方法 (**** 例:app.use(express.static(path.join(__dirname,'xxx'))) ****) 來重新設定靜態資源根目錄之前(或者其他重置根目錄方法), 以上測試的一切連結地址,都還是以D盤根目錄為準沒有改變 理解了就想通了 --> <!-- 後續測試,在開啟本地伺服器情況下,不通過href連結開啟目標檔案 通過在位址列輸入./能否訪問 經過拼接後的__dirname是D盤到urlTest所在目錄 即D:\develop-tools\code\nodeExercise\urlTest 也是localhost:3000/ 我如果想訪問2-1.html 輸入./first/second/2-1.html應該可以 驗證結束,猜想正確,在我輸入http://localhost:3000/./first/second/2-1.html後 瀏覽器跳轉到了目標檔案,並且位址列自動刪掉了那個.變成了http://localhost:3000/first/second/2-1.html -->

以下是開啟伺服器程式碼——>urlTest.js

const http = require('http')
const urltest = http.createServer()
const url = require('url')
const path = require('path')
//讀取檔案
const fs = require('fs')

urltest.on('request',(req,res)=>{

    let realpath= path.join(__dirname,url.parse(req.url).pathname)
    fs.readFile(realpath,(err,result)=>{
        if(err !== null){
            res.end('failed')
            return
        }
        res.end(result)
    })

})
// console.log(url.parse(req.url).pathname);
console.log(__dirname);

urltest.listen(3000)
console.log('啟動成功');

詳細總結寫在第一段程式碼的末尾註釋裡,這裡簡要概括一下,所有路徑本質上都是絕對路徑,只不過開啟伺服器後在位址列裡面基本上沒有輸入./這種情況,都是直接/,localhost其實就是當前開啟伺服器那個js檔案的所在目錄,

以下情況另外考慮
如果重新設定了根目錄,比如art-template模板檔案,有可以設定一個views資料夾來存放模板檔案,方便用,那麼,針對模板檔案的引用,根目錄就變成了views資料夾,但是其他的不變

//告訴express框架模板的位置
app.set('views',path.join(__dirname,'views'))
//告訴express框架模板的預設字尾
app.set('view engine','art')
//當渲染字尾為art的模板時,告訴express用什麼模板引擎
app.engine('art',require('express-art-template'))

又比如放開靜態資源的時候,也可能重新設定根目錄,所以靜態資源也可以相對於從localhost開始稍微簡潔的輸入,而不用每一級都寫,

如下例,當前localhost為blog目錄
如果不設定靜態資源根目錄,訪問1.jpg需要寫localhost/public/home/image/1.jpg
設定過後只需要寫public下的目錄就行,即localhost/home/image/1.jpg
在這裡插入圖片描述

//開放靜態資原始檔,添加了絕對路徑,所以訪問的時候,只需要輸入
//相對本路徑已經是public的路徑就行,比如localhost/home/image/1.jpg
app.use(express.static(path.join(__dirname,'public')))

所以就算重新設定了根目錄,也是針對設定過的模板檔案或者靜態檔案,或者其他專門設定的檔案,他們只是走了個捷徑而已,對於剩下的普通檔案,還是該咋寫咋寫。

本文參考了

https://blog.csdn.net/weixin_41267342/article/details/78750289?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.control