最近公司申請了微信的H5支付 相關支付文件見這裡 pay.weixin.qq.com/wiki/doc/api/H5.... 釋出上線後發起支付 一直報錯 商家引數格式有誤,請聯絡商家解決
根據微信官方文件的錯誤提示 應該是 referer
丟失的問題 於是定位一通發現還真是 referer
丟失了 記錄下解決問題過程。
Referer 是什麼
HTTP Referer是 HTTP
請求 header
頭資訊的一部分 當瀏覽器向web伺服器傳送請求的時候,一般會帶上Referer
告訴伺服器我是從哪個頁面連結過來的,伺服器藉此可以獲得一些資訊用於處理。
比如我們在 Chrome
瀏覽器的控制檯下 可以看到 Request Headers
下有類似如下的資訊
Provisional headers are shown
Accept: /
Origin: local.test5.show
Referer: local.test5.show/test/show
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36
其中 Referer
就是該屬性了
Referer 的正確英語拼法是 referrer。由於早期 HTTP 規範的拼寫錯誤,為了保持向後相容就將錯就錯了
Referer 的作用
防盜鏈
比如你發現訪問載入自己的資源 而 referer不是自己的站點 就可以遮蔽它
防止惡意請求
這點同上
高階用法
比如微信H5支付 也需要這個 就不知道他們做啥用了(hhh
Referer 丟失
關於 Referer
丟失的問題 首先 referer 是由客戶端的瀏覽器傳送到伺服器上,且在客戶端可以透過 document.referrer
來獲取,也就是說referer的傳送實際上是一個瀏覽器行為,傳送與否的決定權是在瀏覽器手裡。雖然這樣說,但是HTTP協議對什麼情況下,瀏覽器該傳送,什麼情況下不該傳送有著嚴格的規定。
總結下 Referer 丟失的幾種情況
1.當網站使用refresh欄位進行跳轉的時候,大多數瀏覽器不傳送referer
2.從使用者從一個HTTPS的網站點選連結到另一個HTTP的網站時,不傳送referer
3.html5中,a標籤的rel = “noreferrer”, 可以讓瀏覽器不傳送referer
4.使用Data URI scheme連結的,瀏覽器也不傳送referer
5.使用Content Security Policy, 也可以讓瀏覽器不傳送referer
6.在html頭部中使用meta標籤來控制不讓瀏覽器傳送referer
自動生成URL連結HTTPS變HTTP
有時候需要在API專案中生成一些URL連結返回 但是伺服器端已經配置了支援HTTPS,透過HTTPS訪問的時候生成的URL仍然是HTTP
關於這個問題其實是伺服器 配置 問題 和 下面類似
回到我遇到的微信支付問題 跟蹤了一圈瀏覽器的跳轉之後發現是屬性第二種情況 從 HTTPS 站點跳到 HTTP 站點 丟失了 Referer【ps:反過來從HTTP到HTTPS是沒問題的 不會丟失 Referer】 中間藏的比較深
當然我一開始沒有發現這個問題 因為從前端請求到 API 整個都沒有問題 全部專案已經全線部署了 HTTPS , Referer 資訊也有攜帶 然後到最後一步微信的支付請求URL的時候 Referer 就丟失了.
後面發現在請求到API專案的時候 API專案返回了一個 URL 給前端 這個 URL 是後端程式碼根據規則生成的(Laravel 裡的 action 輔助函式) 這個函式本身並沒有什麼問題 但是生成的URL連結 是 HTTP 了 又搞事情!!!
API專案配置的是 HTTPS 請求 但是生成的URL是 HTTP 問題就是這裡了 請求運維哥協助 最後發現是 Nginx 反向代理中配置的問題
nginx伺服器配置片段如下:
location / {
proxy_pass http://114.114.114.114:80;
}
可以看到 proxy_pass 引數 指向的是 HTTP的協議 所以在 後臺獲取的 URL 都是HTTP協議的
把代理這設定成 https://114.114.114.114:443;
即可 問題終解決
本作品採用《CC 協議》,轉載必須註明作者和本文連結