經(jīng)常會(huì)有同學(xué)遇到api通過ip可以訪問,但是通過域名卻不可以訪問。本篇文章總結(jié)了造成這種情況可能的原因。

因?yàn)榕c具體技術(shù)的選型、規(guī)則配置有關(guān),所以沒有深入討論,只是列出可能性,僅供參考。
分析
問題
通過域名訪問不到的請求表現(xiàn)的現(xiàn)象有
- 接口返回404
- 一個(gè)錯(cuò)誤頁面
- 提示method type不支持
- 提示接口缺乏必要的參數(shù)
這些都是接口訪問不到,2是配置了錯(cuò)誤頁面;3,4則發(fā)出的POST/PUT 請求,但是請求了GET方法
概覽
通過域名訪問,在整個(gè)后端的訪問路徑如下圖,大致分四個(gè)部分,瀏覽器、負(fù)載均衡層、網(wǎng)關(guān)層、服務(wù)層。
域名解析這里忽略不討論了。

出現(xiàn)ip可以訪問,但是域名不可訪問,4層都有可能導(dǎo)致這個(gè)問題。
微服務(wù)層
- 配置了接口訪問權(quán)限
在微服務(wù)口中,單獨(dú)限制了這個(gè)接口的訪問權(quán)限,導(dǎo)致該接口沒有注冊到注冊中心,這個(gè)可以通過查看代碼,或者查看注冊中心注冊列表找出問題。
- 該接口的api prefix不符合該服務(wù)的規(guī)則
網(wǎng)關(guān)在根據(jù)api uri路由到某個(gè)具體服務(wù)時(shí),為了提高檢索效率,有些定義了路由規(guī)則,不同服務(wù)以不同的prefix來區(qū)分。這樣服務(wù)里面的某個(gè)api prefix不符合該服務(wù)定義的前綴規(guī)則,則匹配不上
(當(dāng)然一般的網(wǎng)關(guān)路由會(huì)做降級,前綴不符,就降級為遍歷)
這個(gè)可以通過訪問網(wǎng)關(guān)的ip/uri來找出問題。
網(wǎng)關(guān)層
- 路由算法有問題
- 沒有訂閱微服務(wù)
- 不是所有的微服務(wù)都需要對外暴露,對于中臺(tái)類/或者其他一些內(nèi)部服務(wù)是不對外暴露的。這些api是不可以直接通過域名訪問的。
這些都可以通過訪問網(wǎng)關(guān)的依賴,或者網(wǎng)關(guān)ip/uri來找出問題。
Nginx
Nginx里可以配置各種redirect規(guī)則,過濾規(guī)則。當(dāng)通過網(wǎng)關(guān)ip可以訪問api時(shí),那多半是nginx的問題。可以檢查nginx的配置問題,來定位問題。
瀏覽器重定向,將POST/PUT請求改寫成了GET請求
比如網(wǎng)站從http升級到https,某個(gè)uri redirect了。當(dāng)我們在瀏覽器中鍵入以www為開頭的網(wǎng)址時(shí),網(wǎng)頁并不會(huì)自動(dòng)跳轉(zhuǎn)為HTTPS網(wǎng)站,因?yàn)闉g覽器默認(rèn)打開HTTP網(wǎng)站,基于此,我們就需要對HTTP的訪問在服務(wù)器端做301、302或307重定向,使之跳轉(zhuǎn)到HTTPS網(wǎng)站。當(dāng)使用了301,302后,瀏覽器會(huì)使用GET方式訪問在Location中規(guī)定的URI,而無視原先請求的方法。