目录
短网址探究,网址探究
引言
原理
编码
结果
首页 后端开发 php教程 短网址探究,网址探究_PHP教程

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

Jul 13, 2016 am 10:04 AM
http 下面 司空见惯 引言 探究 网址

短网址探究,网址探究

引言

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

  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>);
登录后复制

 

结果

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

  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:/...
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Python 包管理器的天坑陷阱:如何避免 Python 包管理器的天坑陷阱:如何避免 Apr 01, 2024 am 09:21 AM

python包管理器是一个强大且方便的工具,用于管理和安装Python包。然而,使用时若不谨慎,可能会陷入各种陷阱。本文将介绍这些陷阱以及应对策略,以帮助开发者避免它们。陷阱1:安装冲突问题:当多个包提供具有相同名称但不同版本的函数或类时,可能会发生安装冲突。应对:在安装前检查依赖关系,确保包之间没有冲突。使用pip的--no-deps选项避免自动安装依赖项。陷阱2:旧版本包问题:如果未指定版本,包管理器可能会安装最新版本,即使有更稳定或适合您需求的旧版本。应对:在安装时明确指定所需版本,例如p

如何使用C++实现HTTP流传输? 如何使用C++实现HTTP流传输? May 31, 2024 am 11:06 AM

如何在C++中实现HTTP流传输?使用Boost.Asio和asiohttps客户端库创建SSL流套接字。连接到服务器并发送HTTP请求。接收HTTP响应头并打印它们。接收HTTP响应正文并打印它。

Java Git 入门:版本控制的入门指南 Java Git 入门:版本控制的入门指南 Mar 27, 2024 pm 02:21 PM

版本控制系统(VCS)是软件开发中不可或缺的工具,它允许开发人员跟踪和管理代码更改。git是一个流行且功能强大的VCS,广泛应用于Java开发中。本指南将介绍Git的基本概念和操作,为Java开发人员提供版本控制的基础知识。Git的基本概念仓库:代码和版本历史记录存储的位置。分支:代码库中的独立开发线,允许开发人员在不影响主开发线的情况下进行更改。提交:代码库中代码的一次更改。回滚:将代码库恢复到以前的提交。合并:将两个或多个分支中的更改合并到一个分支中。Git入门1.安装Git从官方网站下载并

Java 并发集合的未来展望:探索新特性和发展趋势 Java 并发集合的未来展望:探索新特性和发展趋势 Apr 03, 2024 am 09:20 AM

随着分布式系统和多核处理器的兴起,并发集合在现代软件开发中变得至关重要。java并发集合提供了高效且线程安全的集合实现,同时管理并发访问的复杂性。本文探讨了Java并发集合的未来展望,重点关注新特性和发展趋势。新特性JSR354:弹性并发集合jsR354定义了具有弹性行为的新并发集合接口,即使在极端并发条件下也能确保性能和可靠性。这些接口提供了原子性的附加功能,例如支持可变不变式和非阻塞迭代。RxJava3.0:反应式并发集合RxJava3.0引入了反应式编程概念,使并发集合能够与反应式数据流轻

Java 文件操作的哲学:理解文件的本质 Java 文件操作的哲学:理解文件的本质 Mar 21, 2024 pm 03:20 PM

文件是计算机系统中信息存储和管理的基本单元,也是Java文件操作的核心关注点。理解文件的本质对于有效地操作和管理文件至关重要。抽象和层次结构文件本质上是一个抽象概念,代表着存储在持久介质(例如磁盘或内存)中的一组数据。文件的逻辑结构通常由操作系统定义,并提供对数据的组织和访问机制。在Java中,文件通过File类表示,它提供了对文件系统的抽象访问。数据持久性文件的关键特性之一是其数据持久性。与内存中的数据不同,文件中的数据即使在应用程序退出后仍然存在。这种持久性使得文件成为长期存储和共享信息的有

教你如何利用PHP去除网址路径的后缀 教你如何利用PHP去除网址路径的后缀 Mar 21, 2024 pm 03:39 PM

教你如何利用PHP去除网址路径的后缀在网站开发中,经常会遇到需要去除网址路径后缀的需求,以实现更加美观和规范的URL。今天我们将来学习如何利用PHP去除网址路径的后缀,让我们一同探讨这个问题。首先,我们需要明确一下我们想要实现的效果。通常,网址路径后缀指的是URL中的文件扩展名,比如.php、.html等。我们的目标是在用户访问带有后缀的URL时,可以自动去

揭秘 PHP Phar 扩展:赋能动态 PHP 应用 揭秘 PHP Phar 扩展:赋能动态 PHP 应用 Mar 25, 2024 am 09:01 AM

PHPPhar扩展为php开发人员提供了一种强大且灵活的方法来打包脚本、库和资源。通过创建Phar归档文件,开发者可以轻松地部署和分发复杂的应用程序,而无需担心文件系统权限或依赖关系。Phar文件的优势单文件部署:Phar归档将应用程序的所有组件打包到一个文件中,便于分发和部署。独立性:Phar文件独立于文件系统,因此应用程序可以在任何具有PHP解释器的机器上运行。代码保护:Phar文件可以加密以保护其内容免遭未经授权的访问。版本控制:Phar扩展提供对Phar文件的版本控制支持,允许开发者跟踪

Python 和 Jython:解锁跨平台开发的潜力 Python 和 Jython:解锁跨平台开发的潜力 Mar 18, 2024 pm 10:20 PM

跨平台开发对于构建可同时在多种操作系统上无缝运行的应用程序至关重要。python和Jython作为领先的编程语言,提供跨平台开发的强大解决方案,释放其潜力。Python的跨平台兼容性Python是一种解释型语言,它使用虚拟机来执行代码。这种架构允许Python代码在多种平台上运行,包括windows、linux、MacOS和移动设备。Python的广泛平台支持使其成为构建跨平台应用程序的理想选择。此外,Python拥有丰富的第三方库生态系统,提供广泛的功能,从数据处理和WEB开发到机器学习和数据

See all articles