最近公司申請了微信的H5支付 相關支付文檔見這里 https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_4發(fā)布上線后發(fā)起支付 一直報錯 商家參數(shù)格式有誤,請聯(lián)系商家解決
根據(jù)微信官方文檔的錯誤提示 應該是 referer
丟失的問題 于是定位一通發(fā)現(xiàn)還真是 referer
丟失了 記錄下解決問題過程。
Referer 是什么
HTTP Referer是 HTTP
請求 header
頭信息的一部分 當瀏覽器向web服務器發(fā)送請求的時候,一般會帶上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 規(guī)范的拼寫錯誤,為了保持向后兼容就將錯就錯了
Referer 的作用
防盜鏈
比如你發(fā)現(xiàn)訪問加載自己的資源 而 referer不是自己的站點 就可以屏蔽它
防止惡意請求
這點同上
高級用法
比如微信H5支付 也需要這個 就不知道他們做啥用了(hhh
Referer 丟失
關于 Referer
丟失的問題 首先 referer 是由客戶端的瀏覽器發(fā)送到服務器上,且在客戶端可以通過 document.referrer
來獲取,也就是說referer的發(fā)送實際上是一個瀏覽器行為,發(fā)送與否的決定權是在瀏覽器手里。雖然這樣說,但是HTTP協(xié)議對什么情況下,瀏覽器該發(fā)送,什么情況下不該發(fā)送有著嚴格的規(guī)定。
總結下 Referer 丟失的幾種情況
1.當網(wǎng)站使用refresh字段進行跳轉的時候,大多數(shù)瀏覽器不發(fā)送referer
2.從用戶從一個HTTPS的網(wǎng)站點擊鏈接到另一個HTTP的網(wǎng)站時,不發(fā)送referer
3.html5中,a標簽的rel = “noreferrer”, 可以讓瀏覽器不發(fā)送referer
4.使用Data URI scheme鏈接的,瀏覽器也不發(fā)送referer
5.使用Content Security Policy, 也可以讓瀏覽器不發(fā)送referer
6.在html頭部中使用meta標簽來控制不讓瀏覽器發(fā)送referer
自動生成URL鏈接HTTPS變HTTP
有時候需要在API項目中生成一些URL鏈接返回 但是服務器端已經(jīng)配置了支持HTTPS,通過HTTPS訪問的時候生成的URL仍然是HTTP
關于這個問題其實是服務器 配置 問題 和 下面類似
回到我遇到的微信支付問題 跟蹤了一圈瀏覽器的跳轉之后發(fā)現(xiàn)是屬性第二種情況 從 HTTPS 站點跳到 HTTP 站點 丟失了 Referer【ps:反過來從HTTP到HTTPS是沒問題的 不會丟失 Referer】 中間藏的比較深
當然我一開始沒有發(fā)現(xiàn)這個問題 因為從前端請求到 API 整個都沒有問題 全部項目已經(jīng)全線部署了 HTTPS , Referer 信息也有攜帶 然后到最后一步微信的支付請求URL的時候 Referer 就丟失了.
后面發(fā)現(xiàn)在請求到API項目的時候 API項目返回了一個 URL 給前端 這個 URL 是后端代碼根據(jù)規(guī)則生成的(Laravel 里的 action 輔助函數(shù)) 這個函數(shù)本身并沒有什么問題 但是生成的URL鏈接 是 HTTP 了 又搞事情?。?!
API項目配置的是 HTTPS 請求 但是生成的URL是 HTTP 問題就是這里了 請求運維哥協(xié)助 最后發(fā)現(xiàn)是 Nginx 反向代理中配置的問題
nginx服務器配置片段如下:
location / { proxy_pass http://114.114.114.114:80; }
可以看到 proxy_pass 參數(shù) 指向的是 HTTP的協(xié)議 所以在 后臺獲取的 URL 都是HTTP協(xié)議的
把代理這設置成 https://114.114.114.114:443;
即可 問題終解決
?推薦:《微信開發(fā)教程》? ? ? ? ? ? ? ? ? ? ? ? ? ??
以上是總結Referer遺失的問題(微信H5支付)的詳細內容。更多資訊請關注PHP中文網(wǎng)其他相關文章!

熱AI工具

Undress AI Tool
免費脫衣圖片

Undresser.AI Undress
人工智慧驅動的應用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)