代理自動配置文件PAC的使用方法

来源:https://www.cnblogs.com/andrewwang/archive/2018/07/12/9299087.html
-Advertisement-
Play Games

我通常上網使用兩個瀏覽器,safari用於一般上網;Chrome安裝SwitchyOmega插件,在不同的代理中切換,來保證某些網站的上網速度。 但是這種方式到了手機上就有點懵,幾乎所有的iPhone瀏覽器都不支持代理的自動切換和設置,所以只能選一個相對相容性比較好的網路方式一直用下去。很不爽利。。 ...



我通常上網使用兩個瀏覽器,safari用於一般上網;Chrome安裝SwitchyOmega插件,在不同的代理中切換,來保證某些網站的上網速度。
但是這種方式到了手機上就有點懵,幾乎所有的iPhone瀏覽器都不支持代理的自動切換和設置,所以只能選一個相對相容性比較好的網路方式一直用下去。很不爽利。。。
後來發現代理自動配置文件PAC是個好東西,跟SwitchyOmega類似,能夠比較智能的切換所需,所以給大家推薦一下。

通常設備上網的設置,都有3個選項,1是直接連接,不使用代理;2是自行設置http代理;3是使用代理自動配置文件URL。
這個URL指向的就需要是一個PAC文件。如果在電腦上,可以是file:///這種形式指向本地的文件。如果是手機上,則只能放到一個可以http訪問的伺服器上。
PAC文件本質是js的一個子集,其中必須實現一個函數:

function FindProxyForURL(url, host)

兩個參數,url是將要訪問的網路地址,host是從url中分離出來的主機名。
每次瀏覽器訪問任何一個網址的時候,都會調用這個腳本,根據腳本的返回值,選擇瀏覽器使用哪個代理來訪問互聯網。
FindProxyForURL函數返回的訪問方式,可以支持三種:

DIRECT
    直接訪問,不適用任何代理
PROXY host:port
    設置http代理,host是代理主機,port是代理埠
SOCKS host:port
    使用SOCKS代理模式,後面是主機及埠號

這三種方式,前兩種是所有瀏覽器都支持的。第三種SOCKS,有的瀏覽器會解釋為SOCKS5,有的瀏覽器會解釋為SOCKS4,還有的瀏覽器還另外提供了SOCKS5方式。在mac Safari瀏覽器上及iPhone中是將SOCKS解釋為SOCKS5協議。

對於PAC所使用的js語言的語法,不同瀏覽器的支持也不一樣。IE支持完整的js語法,甚至alert命令彈出視窗都支持。Safari則嚴格遵循PAC的規範,僅支持簡單局部變數的賦值和if語句及return語句。
所以通常安全起見,如果你的PAC文件會用在很多場合,最好考慮相容性然後再編寫。
PAC所支持的函數並非通常瀏覽器中的函數,詳細內容可以參考這個網址

具體PAC腳本的編寫方法我們參考完成的腳本來解釋:

function FindProxyForURL(url, host)
{
    url  = url.toLowerCase();
    host = host.toLowerCase();

    if (shExpMatch(url,"*twitter*")  ||
        shExpMatch(url,"*facebook*") ||
        shExpMatch(url,"*fb*") ||
        shExpMatch(url,"*messenger*")) {
            return "PROXY 192.168.1.1:8080; DIRECT";
        };
    
    if (shExpMatch(url,"*youtube*") ||
        shExpMatch(url,"*google*")){
            return "PROXY 192.168.1.2:8080; DIRECT";
        };
        
    if (shExpMatch(url,"*wikipedia*") ||
        shExpMatch(url,"*blogspot*") ||
       ){
        return "PROXY 192.168.1.3:8080; DIRECT";
    }
    return "DIRECT";
}

shExpMatch是PAC專用的函數之一,判斷url中是否包含某個網址,"*"是通配符的意思,表示url兩端可以有任意字元,只要中間部位匹配成功即可。3組條件各自返回一個代理,都不能匹配,使用DIRECT直連。
PROXY 192.168.1.1:8080; DIRECT是用分號隔開的兩個代理模式,如果前面的代理協議本瀏覽器不支持的話,使用後面的協議。
所以類似SOCKS的協議,可以寫成:

SOCKS5 192.168.1.1:8081; SOCKS 192.168.1.1:8082; DIRECT

這表示如果瀏覽器支持SOCKS5命令,則使用第一個協議;如果不支持SOCKS5命令,使用第二個SOCKS協議,實際在iPhone這就代表SOCKS5;前面兩個都不支持,則DIRECT。
PAC中支持的函數有好幾個,另外兩個可能常用到的是:isInNet和dnsResolve,來看一個例子:

    if (isInNet(dnsResolve(host), "192.168.0.0", "255.255.0.0") ||
        isInNet(dnsResolve(host), "127.0.0.0", "255.255.255.0"))){
            return "DIRECT"
        }

剛纔說過了,host是自url中分離出來的主機網址,首先使用dns解析為IP地址,然後判斷是否屬於給定的網段。如果是,則返回直連,表示這個網段不通過代理來訪問。
上面舉例的PAC完整文件的例子,是我使用的PAC文件,其中使用了相反的邏輯。是某幾個網站則使用相應代理,否則全部直連。所以沒有使用isInNet和dnsResolve函數。但很多人習慣的時候還是會用到。

使用這種方式後,在iPhone可以愉快的上網,當然仍然有些情況沒辦法解決。比如facebook app,並沒有使用http/https類的協議,而是直接使用tcp/ssl的鏈接獲取數據。這種情況下設置代理和使用PAC都是無效的,目前沒有什麼好辦法。著急的時候可以使用手機瀏覽器訪問https://m.facebook.com來對付對付,體驗方面,肯定差多了。

參考資料:
https://zhiwei.li/text/2015/08/16/用代理自動配置文件pac給iphone和ipad設備添加socks代理/


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 當載入頁面時,“回到頂部” 預設不顯示,當拖滾動條後動態顯示;當點擊 “回到頂部” 時,勻減速回到頂部。 佈局效果如下: 1、首先在設置中的“頁面定製CSS代碼”中,添加如下css代碼(也可以修改成自己喜歡的樣式噢~): 2、然後在“博客側邊欄公告(支持HTML代碼)(支持JS代碼)”中,添加如下j ...
  • 微信的小程式是沒有分享到朋友圈的功能的。小程式目前只能分享到群里或者發給好友。但是業務需要方便推廣,需要分享到朋友圈。 經過度娘後,得出了以下思路:利用小程式canvas繪製圖片,將背景圖和二維碼繪製成一張圖片。百度過幾個好的demo,參考了一下,本以為會很簡單就解決這個問題,然而這個並不是小程式c ...
  • 一、數據類型 js中數據類型分為兩種,原始數據累次能夠和引用數據類型。 1.原始數據類型 2.引用數據類型 3.原始值和引用值 特別提醒的是,在js中,字元串被看做是原始類型,這意味著下麵的操作是非常耗記憶體的。 二、本地對象(內建對象) 1.Array對象 1.創建語法 2.屬性 3.方法 4.數組 ...
  • JavaScript概述 ECMAScript和JavaScript的關係 1996年11月,JavaScript的創造者--Netscape公司,決定將JavaScript提交給國際標準化組織ECMA,希望這門語言能夠成為國際標準。次年,ECMA發佈262號標準文件(ECMA-262)的第一版,規 ...
  • 0. 事件與事件流 事件是瀏覽器與文檔交互的瞬間,如點擊按鈕、填寫表格等操作,它是Javascript與HTML之間溝通的橋梁。DOM是樹狀結構,如果同時給父節點都綁定事件時,當觸發子節點的時候,這兩個事件的發生順序就牽涉到事件流的內容,它描述的是頁面接受時間的順序。事件流描述的是從頁面接收事件的順 ...
  • 在網路載入緩慢或者刷新的時候總會有那麼一瞬間出現vue的模板代碼,實在很影響美觀,對於我這種有強迫症的人來說實在是忍無可忍,後來經過查找資料,終於發現瞭解決方法,可以使用vue現成的指令來解決這個問題:v-cloak 首先在css中加入: 然後需要在元素加上: 這樣,v-cloak所在元素下的變數在 ...
  • HTML介紹 Web服務本質 瀏覽器發請求 --> HTTP協議 --> 服務端接收請求 --> 服務端返迴響應 --> 服務端把HTML文件內容發給瀏覽器 --> 瀏覽器渲染頁面 HTML是什麼? 超文本標記語言(Hypertext Markup Language, HTML)是一種用於創建網頁的 ...
  • 一個div同時設置background-color和background-image的話,color是處於img層下方的,無法實現遮罩效果,所以需要再創建一個div作為其子div,然後設置子div的背景顏色,介紹兩種方法: 第一種,代碼如下: 第二種,通過after偽元素設置,代碼如下: 借鑒文章出 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...