목차
短网址探究,网址探究
引言
原理
编码
结果
백엔드 개발 PHP 튜토리얼 短网址探究,网址探究_PHP教程

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

Jul 13, 2016 am 10:04 AM
http 아래에 평범한 소개 탐구하다 짧은 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>);
로그인 후 복사

 

结果

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

  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 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 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은 Java 개발에 널리 사용되는 인기 있고 강력한 VCS입니다. 이 가이드에서는 Git의 기본 개념과 작업을 소개하여 Java 개발자에게 버전 제어의 기본 사항을 제공합니다. Git Repository의 기본 개념: 코드와 버전 기록이 저장되는 곳입니다. Branch: 개발자가 주요 개발 라인에 영향을 주지 않고 변경할 수 있도록 하는 코드 기반의 독립적인 개발 라인입니다. 커밋: 코드 베이스의 코드 변경입니다. 롤백: 코드 베이스를 이전 커밋으로 되돌립니다. 병합: 둘 이상의 분기의 변경 사항을 단일 분기로 병합합니다. 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를 사용하여 URL 경로의 접미사를 제거하는 방법을 가르쳐주세요. PHP를 사용하여 URL 경로의 접미사를 제거하는 방법을 가르쳐주세요. Mar 21, 2024 pm 03:39 PM

PHP를 사용하여 URL 경로의 접미사를 제거하는 방법을 가르쳐주세요. 웹 사이트 개발 시 보다 아름답고 표준화된 URL을 얻기 위해 URL 경로의 접미사를 제거해야 하는 경우가 종종 있습니다. 오늘 우리는 PHP를 사용하여 URL 경로의 접미사를 제거하는 방법을 배울 것입니다. 이 문제를 함께 살펴보겠습니다. 먼저, 우리가 얻고자 하는 효과가 무엇인지 명확히 해야 합니다. 일반적으로 URL 경로 접미사는 .php, .html 등과 같은 URL의 파일 확장자를 나타냅니다. 우리의 목표는 사용자가 접미사가 있는 URL에 액세스할 때 자동으로 해당 URL로 이동하는 것입니다.

Python과 Jython: 크로스 플랫폼 개발의 잠재력 활용 Python과 Jython: 크로스 플랫폼 개발의 잠재력 활용 Mar 18, 2024 pm 10:20 PM

여러 운영 체제에서 동시에 원활하게 실행될 수 있는 애플리케이션을 구축하려면 크로스 플랫폼 개발이 중요합니다. 선도적인 프로그래밍 언어인 Python과 Jython은 크로스 플랫폼 개발을 위한 강력한 솔루션을 제공하고 그 잠재력을 발휘합니다. Python의 크로스 플랫폼 호환성 Python은 가상 머신을 사용하여 코드를 실행하는 해석 언어입니다. 이 아키텍처를 사용하면 Python 코드를 Windows, Linux, MacOS 및 모바일 장치를 포함한 여러 플랫폼에서 실행할 수 있습니다. Python의 광범위한 플랫폼 지원은 크로스 플랫폼 애플리케이션 구축에 이상적입니다. 또한 Python에는 데이터 처리 및 WEB 개발부터 기계 학습 및 데이터에 이르기까지 광범위한 기능을 제공하는 풍부한 타사 라이브러리 생태계가 있습니다.

PHP Phar 확장 이해하기: 동적 PHP 애플리케이션 강화 PHP Phar 확장 이해하기: 동적 PHP 애플리케이션 강화 Mar 25, 2024 am 09:01 AM

PHPPhar 확장은 PHP 개발자에게 스크립트, 라이브러리 및 리소스를 패키지하는 강력하고 유연한 방법을 제공합니다. Phar 아카이브를 생성함으로써 개발자는 파일 시스템 권한이나 종속성에 대한 걱정 없이 복잡한 애플리케이션을 쉽게 배포하고 배포할 수 있습니다. Phar 파일의 장점 단일 파일 배포: Phar 아카이브는 간편한 배포 및 배포를 위해 애플리케이션의 모든 구성 요소를 단일 파일로 패키지화합니다. 독립성: Phar 파일은 파일 시스템과 독립적이므로 PHP 인터프리터가 있는 모든 시스템에서 애플리케이션을 실행할 수 있습니다. 코드 보호: Phar 파일을 암호화하여 무단 액세스로부터 콘텐츠를 보호할 수 있습니다. 버전 제어: Phar 확장은 Phar 파일에 대한 버전 제어 지원을 제공하여 개발자가

See all articles