﻿# 手動設定網址對應 IP 的方式 ( 主機 IP 域名對應檔 hosts  )

手動設定網址對應 IP 的技巧其實是很基礎的系統管理知識，不過好像還是有許多新手開發人員不知道可以這樣設定，今天我就來說說這個好用的技巧。

![](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/f31c97cb366b42678f64-180948018-10abbe1d-41f9-4960-aff8-d1ea44fd660e.png)

### 緣起

當我們網站建置完成後需要將程式與資料庫安裝到正式主機上，而通常都是先將程式、資料庫都設定正確，最後才是請系統管理員設定 DNS 讓 Domain Name 對應到正式主機的 IP，而設定 DNS 的過程通常會需要幾個小時的時間進行轉換，這導致我們很難立即透過「正式」的網址進行連線測試。

這問題尤其會影響到當我們使用 [Google Maps API](https://cloud.google.com/maps-platform/) 開發的網站時，因為 [Google Maps API](https://cloud.google.com/maps-platform/) 需要註冊一組 Registration Key，而這組 Key 是與 Domain Name 連動的，如果 DNS 遲遲沒設定完成，就很難自行測試或讓客戶來測試。當然，不只是 [Google Maps API](https://cloud.google.com/maps-platform/) 會有這個問題，任何其他網站提供的 API 大多都是跟 Domain Name 做關連的。

除此之外，若公司內部採 NAT 架構連線上網的話，通常在內部架設的網站「對外」與「對內」的 IP 是不一樣的，如果系統管理員沒有將 DNS 設定好的話，你自己也可以透過修改 `hosts` 檔將對外的 Domain Name 改對應到內部的 IP 位址。

### 設定方法

無論是 Windows 主機或 Linux 主機都有個 `hosts` 檔案，裡面定義著讓本機使用的 Domain Name <--> IP 對應表，任何程式在進行網路連線時通常會進行 DNS 伺服器進行 IP 的查詢，不過在查詢之前都一定會先來 `hosts` 檔查詢是否已經有定義過該 Domain Name 的對應 IP，如果沒有的話才會正式進行 DNS 查詢。

在 Windows 下通常 hosts 檔的路徑如下：

```
C:\WINDOWS\system32\drivers\etc\hosts
```

在 Linux 下通常 hosts 檔的路徑如下：

```
/etc/hosts</pre>
```

在 Windows 下的 hosts 檔案格式與 Linux 下的 hosts 檔案格式完全相同，以 Windows 為例，通常預設的內容如下：

```
# Copyright (c) 1993-1999 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
#      102.54.94.97     rhino.acme.com          # source server
#       38.25.63.10     x.acme.com              # x client host

127.0.0.1       localhost
```

預設只會有一筆資料，也就是 `localhost` 對應到 `127.0.0.1` (本機IP)，這就是為什麼我們常常看到 `localhost` 的原因。

我們如果要新增新的 Domain Name 與 IP 對應，只要「以系統管理員身份」開啟 **記事本**(Notepad)，然後開啟 `C:\WINDOWS\system32\drivers\etc\hosts` 檔案，並新增一行到該檔最後面，第一欄請輸入 IP 然後加些空白，再輸入 Domain Name 即可。例如：

```
10.0.0.55   testing.miniasp.com
```

### 資訊安全

除此之外也需要提醒各位，有些惡意軟體(malicious software)或病毒軟體(virus software)會直接修改你的 hosts 檔案，讓你的誤以為連到正常的網站，但事實上卻連到惡意的網站。例如說若有軟體將你的 `hosts` 修改成如下：

```
10.0.2.34   tw.yahoo.com
```

這樣你以後連到 `http://tw.yahoo.com` 就會改連到 `10.0.2.34` 這個 IP 了！這是個很危險的事，這樣的資安攻擊事件幾乎很難查詢異狀，所以定時檢查 `hosts` 檔案是有必要的。

### 快速開啟編輯 hosts 檔案

由於 Windows 10 預設採用 Windows PowerShell 為主，當你使用快速鍵 `Win-X` + `A` 即可以系統管理員身份開啟 Windows PowerShell 命令列視窗，但預設還會出現一個 UAC (User Account Control) 確認視窗，你要按下 `Alt-Y` 才能開啟應用程式。接著你要輸入長長的 `notepad C:\WINDOWS\system32\drivers\etc\hosts` 命令，才能開啟編輯 `hosts` 檔案！

我自己是特別寫了一個名為 `hosts` 的 PowerShell function 來幫我快速開啟檔案：

```powershell
function hosts { notepad c:\windows\system32\drivers\etc\hosts }
```

你只要上述內容加入到 `$PROFILE` 設定檔中，當你每次開啟 Windows PowerShell 的時候，就可以用 `hosts` 命令，快速開啟`notepad C:\WINDOWS\system32\drivers\etc\hosts` 檔案！ 👍

```powershell
notepad $PROFILE
```

> 請注意：在 Visual Studio Code 裡面的 PowerShell 終端機，採用不同的 `$PROFILE` 路徑，所以必須額外設定一次！

設定好之後，就可以用以下快速鍵編輯該檔案：

```
Win-X 👉 A 👉 Alt-Y 👉 hosts 👉‍ Enter
```
