【问题标题】:Reduce link (URL) size减小链接 (URL) 大小
【发布时间】:2012-12-17 14:30:52
【问题描述】:

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

例如我可能有这样的链接:

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 来工作。

实际上,我正在考虑类似链接检查器之类的东西,它可以检查链接在自动修剪之前和之后是否有效,如果没有,那么将在链接的修剪较少的版本中再次进行检查。但这似乎有点矫枉过正......

【问题讨论】:

  • 是 www.example.com 您的网站(即由您控制)还是 www.example.com 的任何网站?
  • 如果你有服务器访问权限,我建议.htaccess RedirectRule's
  • 不,它们不是我的域。请参阅上面添加的注释。

标签: php javascript url hyperlink reduce


【解决方案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,因为服务器可能在响应中包含时间戳等内容。这使得问题变得非常困难,这就是为什么像谷歌这样的公司有很多工程师考虑这样的事情:)。

【讨论】:

  • 现在你只是告诉他向外部服务器发送垃圾邮件请求,坏主意,不好的做法,更不用说不考虑外部地址的主机,作为“本地”主机。
  • 我想最好的办法是先检查robots.txt。但我试图回答这个问题,而不是说“它做不到”。任何会遇到这种负载问题的服务器最好不要连接到互联网。任何网络服务器都会收到数以千计的此类“垃圾邮件”请求,这些请求要么来自错误,要么来自谷歌,要么来自正在扫描漏洞的人......
  • 这是一个开始,是的。但是,正如您所说,可能包含时间戳,页面上可能有访问计数器/时钟,页面可能包含动态/随机内容。从理论上讲,这可能有效,但实际上呢?没办法。
【解决方案2】:

是的,这是可能的:

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() 中的每一项都将替换为""

【讨论】:

  • 好的,我需要一些自动的。我可能不知道网址。
  • 那么,您需要为“当前页面”更改它吗?
  • 当前页面是什么意思?请参阅我对问题的说明;我有很多链接要打印在网站上。首先必须尽可能缩短链接,因为它们可能充满多余的不需要的字符。
  • 你有这些链接的数组或类似的东西吗?您可以遍历链接并将我的代码应用于每个链接。然而,没有办法准确地去除 url 参数,除非你像我一样手动指定它们。
  • 我将它们保存在数据库中。我希望找到自动而不是手动的东西,因为链接不一样并且有不同的额外参数和东西。
【解决方案3】:

这里有一个 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/

【讨论】:

    猜你喜欢
    • 2011-04-09
    • 2013-01-01
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 2012-04-08
    相关资源
    最近更新 更多