原文連接:https://ssshooter.com/2019-05...javascript
放兩個神圖,圖片來自這裏。html
這是正向代理vue
這是反向代理java
在這篇文章裏,反向代理用於處理跨域問題。node
module.exports = { publicPath: '/', devServer: { proxy: { '/wiki': { target: 'http://xxx.com.cn', // 代理到的目標地址 pathRewrite: { '^/wiki': '' }, // 重寫部分路徑 ws: true, // 是否代理 websockets changeOrigin: true, }, }, }, }
咱們神奇的 webpack 有一個能夠幫你實現測試跨域的插件,相信你們都比較熟悉,本質上這個插件的功能來自 http-proxy-middleware。webpack
* 關於 changeOrigin:這個選項的做用真的看不懂(下面是源碼),看代碼貌似是改變 headers 的 host 字段,可是實際上我修改爲 true 和 false 測試,請求頭好像並無變化。可是之前的一個項目中有一個狀況是必須把這個選項設定爲 true 才能正常跨域,因此保險起見設 true。這個問題先放下吧,或者你們知道的話在評論區留言指導一下 OTL。nginx
// 附源碼 if (options.changeOrigin) { outgoing.headers.host = required(outgoing.port, options[forward || 'target'].protocol) && !hasPort(outgoing.host) ? outgoing.host + ':' + outgoing.port : outgoing.host }
按照上面的配置啓動測試環境以後,直接在瀏覽器輸入 http://localhost/wiki/rest/api/2/user/picker
就等於訪問 http://xxx.com.cn/rest/api/2/user/picker
。git
聯動一下以前的普通地址配置。github
在此次要作的配置甚至沒有上次相對位置的理解難,寫法都跟 node 的配置差很少,只須要兩句:web
location /wiki/ { rewrite ^/wiki/(.*)$ /$1 break; proxy_pass http://xxx.com.cn; }
rewrite 的語法是(來自文檔):rewrite regex replacement [flag];
因此上面的效果是匹配 ^/wiki/(.*)$
而後替換爲 /
加匹配到的後面括號後的分塊。
按照上面的配置,重啓 nginx ./nginx -s reload
,直接在瀏覽器輸入 http://localhost/wiki/rest/api/2/user/picker
就等於訪問 http://xxx.com.cn/rest/api/2/user/picker
啦。
其實 $1
在 JavaScript 的正則裏也能使用:
let reg = /^\/wiki\/(.*)$/ '/wiki/2111edqd'.replace(reg, '$1') // => 2111edqd
在這裏,括號的做用就是用於匹配一個分塊。做爲對比再舉一個例子:
let reg = /^\/wiki\/(.*)$/ let reg2 = /^\/wiki\/.*$/ // 其實不用括號也徹底能夠匹配你須要的字符串 // 可是在 match 的時候你就能看到區別 '/wiki/2111edqd'.match(reg) // 輸出 ["/wiki/2111edqd", "2111edqd", index: 0, input: "/wiki/2111edqd", groups: undefined] '/wiki/2111edqd'.match(reg2) // 輸出 ["/wiki/2111edqd", index: 0, input: "/wiki/2111edqd", groups: undefined]
reg 輸出的數組的第二個參數就是所謂的 $1
,若是後面還有其餘括號分組就會有 $2
、$3
,可是不加括號就不存在這個東西。