2013-01-03 105 views
2

是否可以通过PHP或JS减小链接的大小(以文本形式)?减少链接(URL)大小

E.g.我可能有这样的链接:

http://www.example.com/index.html      <- Redirects to the root 
http://www.example.com/folder1/page.html?start=true <- Redirects to page.html 
http://www.example.com/folder1/page.html?start=false <- Redirects to page.html?start=false 

目的是要找出,如果链接可以缩短,仍然指向相同的位置。在这些示例中,前两个链接可以减少,因为第一个指向根,第二个链接的参数可以省略。
第三个链接就是这种情况,其中参数不能省略,这意味着它不能被减少得比删除http://更多。

所以上面的链接会减少这样的:

Before: http://www.example.com/index.html 
After: www.example.com 

Before: http://www.example.com/folder1/page.html?start=true 
After: www.example.com/folder1/page.html 

Before: http://www.example.com/folder1/page.html?start=false 
After: www.example.com/folder1/page.html?start=false 

这是可以通过PHP或JS?

注:

www.example.com是不是我自己或者通过URL访问外域。这些链接可能是未知的,我正在寻找像自动链接缩短器这样的东西,它可以通过获取URL而不需要其他任何东西。

其实我正在考虑像linkchecker这样的东西,它可以检查链接是否在自动修剪前后工作,如果没有,那么检查将在较少修剪的链接版本中再次完成。但是,这似乎有点小题大做......

+0

是www.example.com您的网站(即它由您控制)还是www.example.com任何网站? – GeneSys

+0

如果你有服务器访问,我建议.htaccess'RedirectRule'的 –

+0

不,他们不是我的域名。上面的补充说明。 – Steeven

回答

1

既然你想自动做到这一点,你不知道的参数是如何改变行为,你将不得不通过试验和错误要做到这一点:尝试删除部分从URL中查看服务器是否用不同的页面进行响应。

在最简单的情况下,这可以在某种程度上像这样工作:

<?php 
    $originalUrl = "http://stackoverflow.com/questions/14135342/reduce-link-url-size"; 

    $originalContent = file_get_contents($originalUrl); 

    $trimmedUrl = $originalUrl; 

    while($trimmedUrl) { 
     $trialUrl = dirname($trimmedUrl); 
     $trialContent = file_get_contents($trialUrl); 
     if ($trialContent == $originalContent) { 
      $trimmedUrl = $trialUrl; 
     } else { 
      break; 
     } 
    } 

    echo "Shortest equivalent URL: " . $trimmedUrl; 
    // output: Shortest equivalent URL: http://stackoverflow.com/questions/14135342 
?> 

为了您的使用场景,你的代码会更复杂一些,因为你将不得不测试依次对每个参数,看是否有必要。有关起点,请参阅parse_url()parse_str()函数。

请注意:此代码非常慢,因为它会对您想要缩短的每个URL执行大量查询。另外,它可能无法缩短很多URL,因为服务器可能在响应中包含时间戳等内容。这使问题变得非常困难,这就是为什么像谷歌这样的公司有许多工程师会考虑像这样的东西的原因:)。

+0

现在,你只是告诉他垃圾邮件的外部服务器的请求,坏主意,不好的做法,更不用说不考虑外部地址的主机,作为“本地”主机。 – Cerbrus

+1

我想做的好事是首先检查'robots.txt'。但我试图回答这个问题,而不是说“不能做”。任何对这种负载都有麻烦的服务器最好不要连接到互联网。任何网络服务器都会收到数千个这样的“垃圾邮件”请求,包括错误,谷歌或者扫描漏洞的人员...... –

+0

这将是一个开始,是的。但是,正如您所说,可能包含时间戳,页面上可能有一个访问计数器/时钟,该页面可能包含动态/随机内容。 理论上,这可能有效,但实际上?没门。 – Cerbrus

0

是啊,这是可能的:

JS:

var url = 'http://www.example.com/folder1/page.html?start=true'; 
url = url.replace('http://','').replace('?start=true','').replace('/index.html',''); 

PHP:

$url = 'http://www.example.com/folder1/page.html?start=true'; 
$url = str_replace(array('http://', '?start=true', '/index.html'), "", $url); 

(在array()每个项目将与""取代)

+0

好吧,我需要一些自动的东西。我可能不知道网址。 – Steeven

+0

那么,您需要将其更改为“当前页面”? – Cerbrus

+0

本页是什么意思?请参阅我对问题的说明;我想要在网站上打印很多链接。首先必须尽可能缩短链接,因为它们可能充满了额外的不必要的字符。 – Steeven

0

这是一个JS给你。

function trimURL(url, trimToRoot, trimParam){ 
    var myRegexp = /(http:\/\/|https:\/\/)(.*)/g; 
    var match = myRegexp.exec(url); 
    url = match[2]; 
    //alert(url); // www.google.com 
    if(trimParam===true){ 
     url = url.split('?')[0]; 
    } 
    if(trimToRoot === true){ 
     url = url.split('/')[0]; 
    } 
    return url 
} 

alert(trimURL('https://www.google.com/one/two.php?f=1')); 
alert(trimURL('https://www.google.com/one/two.php?f=1', true)); 
alert(trimURL('https://www.google.com/one/two.php?f=1', false, true)); 

小提琴:http://jsfiddle.net/5aRpQ/