小屋創作

日誌2019-07-05 20:12

[達人專欄] 論壇是怎麼架設的?自己動手做做看!(一)

作者:解凍豬腳

 
  你是否想過自己架設一個網站呢?

  小學三年級的時候,我還真的想過。記得當時很天真地上 Yahoo! 搜尋「如何做網站」,找到了一堆 Microsoft FrontPage 的資料,然後就很興奮地打開電腦的 FrontPage,也塞了一堆垃圾內容湊成一個 html 檔案,結果卻發現根本沒辦法讓別的電腦看到我的網頁,於是我就放棄了。

  接下來十幾年的學生生涯,技能樹被我亂點一通,直到大學某個學期扛完整個小組的期末專題,才終於弄懂網站運作的觀念。

  實際寫過一次以後,才發現原來寫網站不是一件想像中那麼困難的事情,因此決定用簡單的方式來分享架設網站的方法。然而,依我幹話很多的習慣看來,單就一篇文章是不可能講得完的,初稿寫完之後也證實了我的幹話真的很多,所以在這之前就先來說明我們平常看到的網站如何運作吧。

  為了弄懂連線的觀念,首先要瞭解我們的電腦平時瀏覽網頁的連線過程,而關於比較底層的觀念就不深入談了。我們以巴哈姆特本身來當作範例:

  https://home.gamer.com.tw/homeindex.php?owner=johnny860726

  這是我的小屋網址。當我們瀏覽這個網址的時候,瀏覽器會把它拆成以下幾種元素:

  1. 傳輸協定:HTTPS
  2. 網域名稱:home.gamer.com.tw
  3. 路徑:/
  4. 程式檔案名:homeindex.php
  5. 參數:{owner: johnny860726}

  接下來我們要知道何謂 DNS 伺服器。DNS 稱為網域名稱系統(Domain Name System),這些 DNS 伺服器的主機裡面通常存了各個網站的真實 IP,就好像戶政事務所知道大家住在哪裡一樣。

  因為我們的電腦起初並不知道 home.gamer.com.tw 在哪裡,因此需要向 DNS 伺服器查詢該域名的 IP 地址:

  我們的電腦:「請問 home.gamer.com.tw 在哪裡?」

  DNS 伺服器:「你好,home.gamer.com.tw 的位置在 104.16.181.30 喔。」

  通常我們的網際網路服務供應業者(ISP,Internet Service Provider,例如中華電信)會提供 DNS 的服務,但也有企業是自行架設,像 Google 本身就有架幾個 DNS(IP 為 8.8.8.8 和 8.8.4.4)。我們可以透過更改電腦的網路設定,去指定改用 Google 的 DNS,否則一般網路預設都會使用 ISP 提供的 DNS。

  簡單來說,如果我辦的是中華電信的網路,我電腦用的 DNS 就會預設是由他們提供。

  這裡可以順帶談談,中國的 ISP 業者使用的 DNS 會配合當局政策,故意混淆某些特定域名和 IP 的對應關係,例如當有人想要查詢 google.com 的 IP,這些中國的 DNS 伺服器就會回應給予假的 IP 地址,所以中國的使用者才會總是連不上 Google 的網站,而需要使用 VPN 翻牆。

  我們知道了該連到哪裡以後,瀏覽器會依照 HTTP 協定規範產生連線請求(request),經由家裡網路的數據機送出含有這些資料的封包,這封包裡就包括了剛才上面列出的程式檔案名、參數,以及我們這些使用者自己的電腦 IP 等資訊。

  巴哈姆特目前使用的 HTTPS(Hypertext Transfer Protocol Secure,超文本傳輸安全協定)正是一種以 HTTP 為基礎傳送資料的協定,而 HTTPS 因為傳輸的資料特別經過加密,也才不容易在過程中遭到別台電腦監聽並竊取資料,是相對比較安全的做法。

  當我們把連線請求送到巴哈姆特的主機之後,巴哈姆特主機對我們的請求內容經過解析,便會呼叫 homeindex.php 這支 PHP 程式,令它開始運作。這支程式會檢查連線請求裡頭附帶的 owner 參數,而因為剛才已經有指定 owner 參數為 johnny860726,所以這支程式知道我們想要看 johnny860726 的小屋,於是接著向巴哈姆特自己的資料庫查詢資料。

  當它找到了符合這個帳號的資料(例如暱稱為解凍豬腳、等級為 43),就會依照這些資料臨時產生出一個網頁,再將這個網頁的內容傳回來。記得剛才說過,我們送出的連線請求資料中含有我們自己電腦的 IP 地址,對吧?所以巴哈姆特的主機才能把資料傳回來。這就好像我們在信件裡面寫上寄件人地址一樣,對方才知道回信該寄到哪裡。

  這些被回傳過來、使用者可見的網頁內容就叫做「前端」,而剛才所舉例如巴哈姆特主機裡的 homeindex.php 程式和背後查詢資料的機制,就稱為「後端」。也因此,我們在徵才文案裡面常見到「前端工程師」和「後端工程師」二詞,工作內容差異正是如此。

  除非利用漏洞取得主機的控制權,否則基本上我們沒辦法知道實際的程式碼內容:它表面上是個 PHP 檔案,但傳回來的資料其實是個 HTML 結構的網頁。依照這樣的原理,也就可以解釋為什麼有些圖片的網址是以 .php 為結尾,因為傳回來的數據只是個圖片檔案,我們並沒有真的「讀取」那個 PHP 檔案的「內容」,而是對方的伺服器執行了那個 PHP 檔案,然後把圖片的「檔案內容」回傳給我們,所以我們的瀏覽器就會認定它是一張圖片。

  沒有錯!巴哈姆特雖然有成千上萬篇文章,但其實他們並沒有把每篇文章存成一個網頁檔案,而是把文章的原始碼存在資料庫裡。當我們向 forum.gamer.com.tw 這台主機的 C.php 送出請求的時候,巴哈姆特的伺服器才往資料庫查詢、動態產生出一個 HTML 網頁,再把產生出來的網頁內容整份傳回來,所以我們才會需要在文章網址傳入 bsn、snA 等參數。

  至於我們如何登入帳號呢?首先要知道,我們在註冊帳號的時候,會先把帳號密碼等資訊傳送給巴哈姆特,註冊成功的話就由他們經過防護措施保存起來,至於這防護措施的細節之後有機會再說吧~

  接著,當我們之後輸入帳號密碼,巴哈姆特的伺服器首先會檢查帳號密碼是不是正確,正確的話就會產生一組 session ID 作為證明,情境如下:

  豬腳:「你好,巴哈姆特,我想登入我的帳號。」

  巴哈姆特:「你哪位?」

  豬腳:「我的帳號是 johnny860726,密碼是 c8763#c8763。」

  巴哈姆特:「我檢查一下……嗯!你的帳號密碼是正確的。我現在隨機產生一組暫時的通關密語,這個通關密語是 bfd65583df5e04bf。下次你找我的時候只要附帶這組通關密語,你就可以用你的身分來發廢文了,這組通關密語我也會幫你記著。」

  這樣當我之後瀏覽小屋的時候,就會有以下情境:

  豬腳:「嗨!又見面了。記得我嗎?看看我手上信封裡的這張紙條吧。」

  巴哈姆特的守衛打開信封檢查紙條,看見上面寫著「bfd65583df5e04bf」,立刻想起了上次給予豬腳許可證的事:「喔!我還記得,通關密語正確呢,看來你就是 johnny860726 本人了。那麼,我就連同你小屋的私人文章一起顯示給你看看吧。」

  這就是 session 的運作原理。

  豬腳拿給守衛的信封記載了一些資訊,這個信封稱為「header」,裡頭被放入了很多張紙條,其中一個紙條正是我們熟知的「cookie」,豬腳的通關密語就寫在 cookie 紙條裡面。有時候這張 cookie 紙條也會寫些其他資訊,例如巴哈姆特會用 cookie 來儲存「是否使用夜間模式瀏覽論壇」或「最近瀏覽過哪些哈啦板」之類比較不需要存在巴哈姆特伺服器上的資料。

  如果你現在已經登入了巴哈姆特,可以試著按下 F12 > Application > Cookies 觀察儲存在你電腦裡的 cookie 表,就會發現巴哈姆特有條 cookie 叫做「BAHARUNE」,那就是巴哈姆特給你的通關密語了。請務必注意,千萬不要讓別人知道你的 BAHARUNE 內容啊!因為那就代表著擁有你帳號權限的鑰匙:



  其實這樣我已經把一個論壇的運作原理幾乎講完了,你信不信?真的就這麼簡單。

  之後,我會實際使用 XAMPP 這套軟體操作一次,並且用常見的 PHP、MariaDB 示例,這樣大家不用買主機就可以用自己的電腦架設一個 HTTP 伺服器,也能體驗一下用網站擁有者的角度來看待這個世界。

  相信看完本篇文以後,你就會知道論壇是怎麼運作,而看完下一篇文就會知道怎麼徒手架設一個簡單的論壇了……應該啦。那今天就先講到這裡囉,感謝大家的觀看。



同系列文章:
論壇是怎麼架設的?自己動手做做看!(二)
論壇是怎麼架設的?自己動手做做看!(三)
 

227

41

LINE 分享

相關創作

休眠睡眠

【教學】BIOS安全開機啟動/MBR轉GPT (不用第三方程式)

OREO餅乾

留言

開啟 APP

face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】