2013-01-03 201 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/