Jadual Kandungan
短网址探究,网址探究
引言
原理
编码
结果
Rumah pembangunan bahagian belakang tutorial php 短网址探究,网址探究_PHP教程

短网址探究,网址探究_PHP教程

Jul 13, 2016 am 10:04 AM
http bawah perkara biasa pengenalan Teroka pendek URL

短网址探究,网址探究

引言

  短网址司空见惯,比如说下面这些

  http://dwz.cn/CSW6Y => http://www.cnblogs.com/iforever/p/4313704.html,

  http://dwz.cn/CSWuP => http://www.cnblogs.com/iforever/p/4279006.html ,等等

  访问这些网址的时候,前后一对的指向同一个页面,我这里只是在举例子,这些短网址在weibo或者类似的社交网络中经常见到,由于原始链接地址特别长,这个时候短网址就会大显威力,简短好记,但也有他的缺点,比如说短网址不一定直接看出网址中的一些信息(在长网址中是可以看到一些信息的)。

  整天接触这个,以至于在还没有真正弄明白他的原理的时候就在思想中烙下了“没什么”的烙印,这就错过了一些知识,这种情况在心理学上应该叫心里暗示吧,有人知道是这样吗?

原理

  首先我猜测这个是通过重定向实现的,dwz.cn是一个服务器,用来接收一些短网址,这些短网址是经过dwz.cn处理之后的,在dwz.cn中有该短网址对应的长网址的记录,然后从数据库中获取短网址对应的长网址,然后302重定向。看看具体是不是这样的。

  通过浏览器访问http://dwz.cn/CSW6Y,对请求进行分析(这里使用chrome的调试工具,也可以使用wireshark之类的工具),可以得到下面的数据:

短网址探究,网址探究_PHP教程name: abit version: 1 handle: - rewrite: if (!-d && !-f && path ~ "/(.*)$") goto "do.php?url=$1&act=out"

  handle:后面的就是rewrite规则,新浪云的具体的详细规则到这里看http://sae.sina.com.cn/doc/php/runtime.html#php-app-config,很简单,nginx、apache的配置也类似。

  重定向完成之后还有一个要注意的地方就是在传递参数的时候要进行urlencode,重定向之前要用urldecode。在未使用urlencode的时候传递url类型的参数,在获取的时候可能丢掉部分信息,因此在生成短链接之前传递参数的时候要将url进行escape处理,将特殊字符串进行编码,在访问短链接处理的时候需要对编码的url进行urldecode处理,还原成正常的链接,否则在header跳转的时候不会把该链接当成一个正常的url,跳转之后会把该url附加的之前页面的主机后面类似http://abit.sinaapp.com/www.cnblogs.com,可能会出现错误,因此,这里要特别注意。

  sae的在重定向的时候会有一个问题,会将双反斜线自动过滤为一个,例如从http://abit.sinaapp.com/到http:/abit.sinaapp.com/,注意,这里少了个反斜线,这在处理的时候要特别注意,不然可能会遇到不必要的麻烦。

编码

  主要的处理部分

<?<span>php
</span><span>class</span><span> snapshotUrl{
    </span><span>//</span><span>进行编码的数据库,没6位二进制数对应一个字符,一共需要64位,因此选取
    //52+10+2个特殊字符</span>
    <span>private</span> <span>static</span> <span>$basedb</span> = <span>array</span><span>(
        </span>'(',')','a','b','c','d',
        'e','f','g','h','i','j',
        'k','l','m','n','o','p',
        'q','r','s','t','u','v',
        'w','x','y','z','A','B',
        'C','D','E','F','G','H',
        'I','J','K','L','M','N',
        'O','P','Q','R','S','T',
        'U','V','W','X','Y','Z',
        '0','1','2','3','4','5',
        '6','7','8','9',<span>
    );

    </span><span>private</span> <span>function</span> long2short(<span>$url</span><span>){
        </span><span>$hex</span> = <span>md5</span>(<span>$url</span><span>);
        </span><span>$out</span> = ''<span>;
        </span><span>$hex</span> = 0x7FFFFFFF & (1 * ('0x'.<span>substr</span>(<span>$hex</span>, 0, 8<span>)));
        </span><span>for</span>(<span>$i</span>=0; <span>$i</span><5; <span>$i</span>++<span>){
            </span><span>$index</span> = 0x3f & <span>$hex</span><span>;
            </span><span>$out</span> .= self::<span>$basedb</span>[<span>$index</span><span>];
            </span><span>$hex</span> = <span>$hex</span>>>6<span>;
        }
        </span><span>return</span> <span>$out</span><span>;
    }

    </span><span>public</span> <span>function</span> retJson(<span>$arr</span><span>){
        </span><span>return</span> json_encode(<span>$arr</span><span>);
    }

    </span><span>//</span><span>对url进行映射保存</span>
    <span>public</span> <span>function</span> dispose(<span>$url</span>, <span>$act</span><span>){
        </span><span>$mysql</span> = <span>new</span><span> SaeMysql();
        </span><span>switch</span> (<span>$act</span><span>) {
            </span><span>case</span> 'in':
                <span>$short</span> = <span>$this</span>->long2short(<span>$url</span><span>);
                </span><span>$url</span> = <span>addslashes</span>(<span>$url</span><span>);
                </span><span>$sql</span> = "insert into `tiny_url`(`short`,`long`) values ('{<span>$short</span>}','{<span>$url</span>}')"<span>;
                </span><span>$mysql</span>->runSql(<span>$sql</span><span>);
                </span><span>if</span>(<span>$mysql</span>->errno() != 0<span>){
                    </span><span>echo</span> "生成失败"<span>;
                }</span><span>else</span><span>{
                    </span><span>echo</span> "http://abit.sinaapp.com/{<span>$short</span>}"<span>;
                }
                </span><span>break</span><span>;
            </span><span>case</span> 'out':
                <span>if</span>(<span>strlen</span>(<span>$url</span>) > 5<span>)
                    </span><span>echo</span> <span>$this</span>->retJson(<span>array</span>("code"=>"-1","msg"=>"没有这条记录"<span>));
                </span><span>$sql</span> = "select * from `tiny_url` where `short`='{<span>$url</span>}' limit 1"<span>;
                </span><span>$data</span> = <span>$mysql</span>->getData(<span>$sql</span><span>);
                </span><span>if</span>(!<span>$data</span><span>) {
                    </span><span>echo</span> <span>$this</span>->retJson(<span>array</span>("code"=>"-1","msg"=>"没有这条记录"<span>));
                }</span><span>else</span><span>{
                    </span><span>$location</span> = <span>urldecode</span>(<span>$data</span>[0]['long'<span>]);
                    </span><span>header</span>("Location: {<span>$location</span>}"<span>);
                    </span><span>exit</span><span>();
                }
                </span><span>break</span><span>;
            
            </span><span>default</span>:
                <span>#</span><span> code...</span>
                <span>break</span><span>;
        }
    }    
}

</span><span>$url</span> = <span>isset</span>(<span>$_GET</span>['url']) ? <span>$_GET</span>['url'] : <span>null</span><span>;
</span><span>$act</span> = <span>isset</span>(<span>$_GET</span>['act']) ? <span>$_GET</span>['act'] : <span>null</span><span>;
</span><span>$snapshotUrl</span> = <span>new</span><span> snapshotUrl();
</span><span>if</span>(<span>$url</span> === <span>null</span> || <span>$act</span> === <span>null</span><span>)
    </span><span>echo</span> <span>$snapshotUrl</span>->retJson(<span>array</span>("code"=>"-1","msg"=>"参数错误"<span>));

</span><span>$snapshotUrl</span>->dispose(<span>$url</span>, <span>$act</span>);
Salin selepas log masuk

 

结果

  我做了个可以测试的小网页:

  http://abit.sinaapp.com/有兴趣的可以试试

 

  本文版权归作者iforever(luluyrt@163.com)所有,未经作者本人同意禁止任何形式的转载,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/965023.htmlTechArticle短网址探究,网址探究 引言 短网址司空见惯,比如说下面这些 http://dwz.cn/CSW6Y=http://www.cnblogs.com/iforever/p/4313704.html, http://dwz.cn/CSWuP=http:/...
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Perangkap lubang benam pengurus pakej Python: bagaimana untuk mengelakkannya Perangkap lubang benam pengurus pakej Python: bagaimana untuk mengelakkannya Apr 01, 2024 am 09:21 AM

Pengurus pakej python ialah alat yang berkuasa dan mudah untuk mengurus dan memasang pakej Python. Walau bagaimanapun, jika anda tidak berhati-hati semasa menggunakannya, anda mungkin terjebak dalam pelbagai perangkap. Artikel ini menerangkan perangkap dan strategi ini untuk membantu pembangun mengelakkannya. Perangkap 1: Masalah konflik pemasangan: Apabila berbilang pakej menyediakan fungsi atau kelas dengan nama yang sama tetapi versi berbeza, konflik pemasangan mungkin berlaku. Respons: Semak kebergantungan sebelum pemasangan untuk memastikan tiada konflik antara pakej. Gunakan pilihan --no-deps pip untuk mengelakkan pemasangan automatik kebergantungan. Kesalahan 2: Isu pakej versi lama: Jika versi tidak dinyatakan, pengurus pakej boleh memasang versi terkini walaupun terdapat versi lama yang lebih stabil atau sesuai untuk keperluan anda. Respons: Nyatakan versi yang diperlukan secara eksplisit semasa memasang, seperti p

Bagaimana untuk melaksanakan penstriman HTTP menggunakan C++? Bagaimana untuk melaksanakan penstriman HTTP menggunakan C++? May 31, 2024 am 11:06 AM

Bagaimana untuk melaksanakan penstriman HTTP dalam C++? Cipta soket strim SSL menggunakan Boost.Asio dan pustaka klien asiohttps. Sambung ke pelayan dan hantar permintaan HTTP. Terima pengepala respons HTTP dan cetaknya. Menerima badan respons HTTP dan mencetaknya.

Bermula dengan Java Git: Panduan Pemula untuk Kawalan Versi Bermula dengan Java Git: Panduan Pemula untuk Kawalan Versi Mar 27, 2024 pm 02:21 PM

Sistem kawalan versi (VCS) ialah alat yang sangat diperlukan dalam pembangunan perisian yang membolehkan pembangun menjejak dan mengurus perubahan kod. git ialah VCS yang popular dan berkuasa yang digunakan secara meluas dalam pembangunan Java. Panduan ini akan memperkenalkan konsep asas dan operasi Git, menyediakan pembangun Java dengan asas kawalan versi. Konsep asas Repositori Git: tempat kod dan sejarah versi disimpan. Cawangan: Barisan pembangunan bebas dalam pangkalan kod yang membolehkan pembangun membuat perubahan tanpa menjejaskan baris pembangunan utama. Komit: Perubahan kepada kod dalam pangkalan kod. Rollback: Kembalikan asas kod kepada komit sebelumnya. Gabung: Gabungkan perubahan daripada dua atau lebih cawangan menjadi satu cawangan. Bermula dengan Git 1. Pasang Git Muat turun dan muat turun dari tapak web rasmi

Falsafah operasi fail Java: memahami sifat fail Falsafah operasi fail Java: memahami sifat fail Mar 21, 2024 pm 03:20 PM

Fail ialah unit asas penyimpanan dan pengurusan maklumat dalam sistem komputer, dan juga merupakan fokus teras operasi fail Java. Memahami sifat fail adalah penting untuk mengendalikan dan mengurusnya dengan berkesan. Abstraksi dan Hierarki Fail pada asasnya adalah abstraksi yang mewakili satu set data yang disimpan dalam medium berterusan seperti cakera atau memori. Struktur logik fail biasanya ditakrifkan oleh sistem pengendalian dan menyediakan mekanisme untuk mengatur dan mengakses data. Di Java, fail diwakili oleh kelas Fail, yang menyediakan akses abstrak kepada sistem fail. Kegigihan Data Salah satu ciri utama fail ialah kegigihan datanya. Tidak seperti data dalam ingatan, data dalam fail kekal walaupun selepas aplikasi keluar. Kegigihan ini menjadikan fail berguna untuk penyimpanan jangka panjang dan perkongsian maklumat.

Ajar anda cara menggunakan PHP untuk mengalih keluar akhiran laluan URL Ajar anda cara menggunakan PHP untuk mengalih keluar akhiran laluan URL Mar 21, 2024 pm 03:39 PM

Ajar anda cara menggunakan PHP untuk mengalih keluar akhiran laluan URL Dalam pembangunan tapak web, anda sering menghadapi keperluan untuk mengalih keluar akhiran laluan URL untuk mencapai URL yang lebih cantik dan standard. Hari ini kita akan belajar cara menggunakan PHP untuk mengalih keluar akhiran laluan URL, mari kita meneroka isu ini bersama-sama. Pertama, kita perlu menjelaskan kesan yang ingin kita capai. Biasanya, akhiran laluan URL merujuk kepada sambungan fail dalam URL, seperti .php, .html, dsb. Matlamat kami adalah untuk pergi ke URL secara automatik apabila pengguna mengakses URL dengan akhiran

Masa depan koleksi serentak di Java: Meneroka ciri dan aliran baharu Masa depan koleksi serentak di Java: Meneroka ciri dan aliran baharu Apr 03, 2024 am 09:20 AM

Dengan peningkatan sistem teragih dan pemproses berbilang teras, koleksi serentak telah menjadi kritikal dalam pembangunan perisian moden. Koleksi serentak Java menyediakan pelaksanaan koleksi yang cekap dan selamat benang sambil menguruskan kerumitan akses serentak. Artikel ini meneroka masa depan koleksi serentak di Jawa, memfokuskan pada ciri dan aliran baharu. Ciri baharu JSR354: Koleksi serentak berdaya tahan jsR354 mentakrifkan antara muka koleksi serentak baharu dengan gelagat anjal untuk memastikan prestasi dan kebolehpercayaan walaupun dalam keadaan serentak yang melampau. Antara muka ini menyediakan ciri tambahan atomicity, seperti sokongan untuk invarian boleh ubah dan lelaran tidak menyekat. RxJava3.0: Koleksi Serentak Reaktif RxJava3.0 memperkenalkan konsep pengaturcaraan reaktif, membolehkan koleksi serentak disepadukan dengan mudah dengan aliran data reaktif.

Python dan Jython: Membuka kunci potensi pembangunan merentas platform Python dan Jython: Membuka kunci potensi pembangunan merentas platform Mar 18, 2024 pm 10:20 PM

Pembangunan merentas platform adalah penting untuk membina aplikasi yang berjalan lancar pada berbilang sistem pengendalian secara serentak. Python dan Jython, sebagai bahasa pengaturcaraan terkemuka, menyediakan penyelesaian yang berkuasa untuk pembangunan merentas platform dan melancarkan potensi mereka. Keserasian merentas platform Python Python ialah bahasa yang ditafsirkan yang menggunakan mesin maya untuk melaksanakan kod. Seni bina ini membolehkan kod Python dijalankan pada berbilang platform, termasuk Windows, Linux, MacOS dan peranti mudah alih. Sokongan platform luas Python menjadikannya sesuai untuk membina aplikasi merentas platform. Selain itu, Python mempunyai ekosistem yang kaya dengan perpustakaan pihak ketiga yang menyediakan pelbagai fungsi, daripada pemprosesan data dan pembangunan WEB kepada pembelajaran mesin dan data

Menyahmistikan Sambungan PHP Phar: Memperkasakan Aplikasi PHP Dinamik Menyahmistikan Sambungan PHP Phar: Memperkasakan Aplikasi PHP Dinamik Mar 25, 2024 am 09:01 AM

Sambungan PHPPhar menyediakan pembangun PHP dengan cara yang berkuasa dan fleksibel untuk membungkus skrip, perpustakaan dan sumber. Dengan mencipta arkib Phar, pembangun boleh menggunakan dan mengedarkan aplikasi kompleks dengan mudah tanpa perlu risau tentang kebenaran atau kebergantungan sistem fail. Kelebihan fail Phar Penggunaan fail tunggal: Phar mengarkibkan membungkus semua komponen aplikasi ke dalam satu fail untuk pengedaran dan penggunaan yang mudah. Kebebasan: Fail Phar adalah bebas daripada sistem fail, jadi aplikasi boleh dijalankan pada mana-mana mesin dengan penterjemah PHP. Perlindungan Kod: Fail Phar boleh disulitkan untuk melindungi kandungannya daripada akses tanpa kebenaran. Kawalan Versi: Sambungan Phar menyediakan sokongan kawalan versi untuk fail Phar, membenarkan pembangun menjejak

See all articles