Jim Deng

Jim Deng

Zero-cost reverse proxy jsdelver

image 

First Method (Virtual Host Reverse Proxy)#

Save the following code as index.php

    <?php
    $file = $_SERVER['REQUEST_URI'];
    $self_path = pathinfo($_SERVER['PHP_SELF'], PATHINFO_DIRNAME);
    $query = '';
    if($_SERVER['QUERY_STRING'])
    {
        $file = explode('?', $file)[0];
        $query = '?' . $_SERVER['QUERY_STRING'];
    }
    $file_info = pathinfo($file);
    $path = $file_info['dirname'];
    if($path=='/') exit('/* ??? */');
    $mimetype = get_mimetype($file_info['extension']);

    $cdn_file = $file;
    if(strlen($self_path)>1){
       $cdn_file = substr($file, strlen($self_path));  
    }

    $local_path = substr(pathinfo( $cdn_file, PATHINFO_DIRNAME), 1);
    if($local_path && !is_dir($local_path)){
    @mkdir($local_path, 755, true);
    }

    $url = 'https://cdn.jsdelivr.net' . $cdn_file . $query;

    $content = curl($url);
    if($content){
        header('content-type:'. $mimetype .';charset=utf-8');
        echo '/* ' . $url .'*/';
        file_put_contents(substr($cdn_file, 1), $content);
        exit($content);
    }else{
        header('location: ' .$url );
    }


    function curl($url)
    {
	    $ch = curl_init();
	    curl_setopt($ch, CURLOPT_URL, $url);
	    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	    curl_setopt($ch, CURLOPT_NOSIGNAL, 1);
	    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 3000);
	    curl_setopt($ch, CURLOPT_TIMEOUT_MS, 3000);
	    if (strpos($url, 'https') !== false) {
		    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
		    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
	    }
	    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0;     Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190       Safari/537.36');
	    $result = curl_exec($ch);
	    curl_close($ch);
	    return $result;
    }
    /**
     * Get the MIME type based on the file extension
     * @param string $extension
     * @return string
     */
     function get_mimetype($extension) {
	    $ct['htm'] = 'text/html';
	    $ct['html'] = 'text/html';
        $ct['txt'] = 'text/plain';
	    $ct['asc'] = 'text/plain';
	    $ct['bmp'] = 'image/bmp';
    	$ct['gif'] = 'image/gif';
	    $ct['jpeg'] = 'image/jpeg';
	    $ct['jpg'] = 'image/jpeg';
	    $ct['jpe'] = 'image/jpeg';
	    $ct['png'] = 'image/png';
	    $ct['ico'] = 'image/vnd.microsoft.icon';
    	$ct['mpeg'] = 'video/mpeg';
    	$ct['mpg'] = 'video/mpeg';
    	$ct['mpe'] = 'video/mpeg';
    	$ct['qt'] = 'video/quicktime';
    	$ct['mov'] = 'video/quicktime';
	    $ct['avi'] = 'video/x-msvideo';
    	$ct['wmv'] = 'video/x-ms-wmv';
    	$ct['mp2'] = 'audio/mpeg';
    	$ct['mp3'] = 'audio/mpeg';
    	$ct['rm'] = 'audio/x-pn-realaudio';
    	$ct['ram'] = 'audio/x-pn-realaudio';
    	$ct['rpm'] = 'audio/x-pn-realaudio-plugin';
    	$ct['ra'] = 'audio/x-realaudio';
    	$ct['wav'] = 'audio/x-wav';
    	$ct['css'] = 'text/css';
	    $ct['zip'] = 'application/zip';
	    $ct['pdf'] = 'application/pdf';
	    $ct['doc'] = 'application/msword';
	    $ct['bin'] = 'application/octet-stream';
	    $ct['exe'] = 'application/octet-stream';
	    $ct['class'] = 'application/octet-stream';
	    $ct['dll'] = 'application/octet-stream';
	    $ct['xls'] = 'application/vnd.ms-excel';
	    $ct['ppt'] = 'application/vnd.ms-powerpoint';
	    $ct['wbxml'] = 'application/vnd.wap.wbxml';
	    $ct['wmlc'] = 'application/vnd.wap.wmlc';
	    $ct['wmlsc'] = 'application/vnd.wap.wmlscriptc';
	    $ct['dvi'] = 'application/x-dvi';
	    $ct['spl'] = 'application/x-futuresplash';
	    $ct['gtar'] = 'application/x-gtar';
	    $ct['gzip'] = 'application/x-gzip';
	    $ct['js'] = 'application/javascript';
	    $ct['swf'] = 'application/x-shockwave-flash';
	    $ct['tar'] = 'application/x-tar';
        $ct['7z'] = 'application/x7zcompressed';
        $ct['rar'] = 'application/x-rar-compressed';
	    $ct['xhtml'] = 'application/xhtml+xml';
    	$ct['au'] = 'audio/basic';
	    $ct['snd'] = 'audio/basic';
	    $ct['midi'] = 'audio/midi';
    	$ct['mid'] = 'audio/midi';
	    $ct['m3u'] = 'audio/x-mpegurl';
    	$ct['tiff'] = 'image/tiff';
    	$ct['tif'] = 'image/tiff';
	    $ct['rtf'] = 'text/rtf';
	    $ct['wml'] = 'text/vnd.wap.wml';
	    $ct['wmls'] = 'text/vnd.wap.wmlscript';
	    $ct['xsl'] = 'text/xml';
	    $ct['xml'] = 'text/xml';
	
	    return isset($ct[strtolower($extension)]) ? $ct[strtolower($extension)] : 'text/html';
    }  

Usage Introduction#

If placed in the root directory, just replace cdn.jsdelivr.net with your domain name.
If placed in a subdirectory, such as the cdn directory, replace cdn.jsdelivr.net with your domain name/cdn (e.g., https://example.com/cdn).

Second Method (Vercel Reverse Proxy)#

Requirements: Vercel account (linked with GitHub), Node.js

Step One#

npm install -g cnpm --registry=https://registry.npmmirror.com

Step Two#

cnpm i -g vercel

Step Three#

vercel login 

Remember to choose GitHub login. You will see a prompt asking if you agree to let Node.js open a webpage. Select yes.

Step Four#

Create and enter a new folder

Create a vercel.json file inside the folder with the following content:

<!-- more -->
{
"version": 2,
"routes": [
{"src": "/(.*)","dest": "https://cdn.jsdelivr.net/$1"}
]
}

Step Five#

vercel -A vercel.json --prod

You can connect to an existing project or create a new one.

Loading...
Ownership of this post data is guaranteed by blockchain and smart contracts to the creator alone.