【问题标题】:detect external broken links检测外部断开的链接
【发布时间】:2017-04-21 02:12:07
【问题描述】:

问题是我的网站上有很多外部下载链接,有些链接已经过期,所以我想自动检测过期的链接。

对我来说,有效链接是指向我的一个文件服务器的直接文件下载链接。 损坏的链接会导致一个带有错误消息的简单 html 页面。

我的第一个想法是获取下载链接的html源代码,看看它是否包含错误但它不起作用。 我也尝试过 javascript,但问题是 js 不处理外部链接。

有什么想法吗? 非常感谢

【问题讨论】:

  • 您可以随时为您正在查看的每个 URL 发送 AJAX 请求,并查看是否收到 404、500 等错误。
  • 为每个链接和每个访问您网站的客户做这个客户端是一个很大的开销,如果一个链接被破坏并从数据库中删除它,为什么不每天在服务器端检查一次呢?

标签: javascript


【解决方案1】:

如果您不介意让客户端完成工作,您可以尝试使用 javascript 来完成。

我有一个greasemonkey脚本,它会自动检查打开页面中的所有链接,并根据服务器响应(未找到、禁止等)标记它们。

看看你能不能从中得到一些想法:http://userscripts.org/scripts/show/77701

我知道跨域策略不适用于 GM_xmlhttprequest,如果想使用 javascript 解决方案,可能必须尝试解决方法,例如:

如果你想要一个服务器端的解决方案,我相信上面的答案可以帮助你。

【讨论】:

    【解决方案2】:

    这不是前端的任务,而是后端的任务。正如超新星所说,每天从您的服务器检查一次。 AJAX 请求不会是您的答案,因为 browser security policy 不允许对不同域的请求。


    解决方案:

    好的,根据您的评论,检查此解决方案:

    <html>
    <head>
      <script src='http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js'></script>
      <script>
        $(document).ready(function(){
          var linksDiv = $('#links');
    
          $('#generateLinks').click(function(){
            //I don't know your logic for this function, so I'll try to reproduce the same behavior
            var someURLs = ['http://www.google.com','http://www.djfhdkjshjkfjhk.com', 'http://www.yahoo.com'];
            linksDiv.html('');
    
            for(var i = 0; i < someURLs.length; i++){
              var link = $('<a/>').attr('href', someURLs[i]).append('link ' + i).css('display','block');
              linksDiv.append(link);
            }
    
          });
    
          $('#getLinksAndSend').click(function(){
            var links = linksDiv.find('a');
    
            var gatheredLinks = [];
    
            $(links).each(function(){
              gatheredLinks.push(this.href);
            });
    
            sendLinks(gatheredLinks);
          });
    
          var sendLinks = function(links){
            $.ajax({
              url: "your_url",
              type: "POST",
              data: {
                links: links
              }
            }).done(function(resp) { 
              alert('Ok!')
            });
          }
        });
      </script>
    </head>
    <body>
      <div id="links">
    
      </div> 
      <button id="generateLinks">Generate all links</button>
      <button id="getLinksAndSend">Get links and send to validator</button>
    </body>
    </html>
    

    【讨论】:

    • 我的目标是有一个按钮,一旦点击它就会扫描我在给定页面上的所有链接并显示损坏的链接,仅此而已。
    • 好的,你的场景和我上面提到的完全一样,你需要在你的服务器中做这个检查,因为通过 AJAX 跨域请求是不可能的。如果您要检查的链接位于您的应用托管的同一个域下,那么您只需使用 JS 就可以做到,但我认为这不是您的情况。您在服务器中使用什么语言?
    • 如果您有任何其他建议,我对 cURL 有疑问??
    • 感谢您的回复,我已经修改了您的脚本,但我不知道为什么它没有重定向到我想通过 POST 发送数据的页面。
    【解决方案3】:

    这可能有点矫枉过正,但 linux kde 中有一个名为 klinkstatus 的程序可以在网站中找到损坏的链接:

    https://www.kde.org/applications/development/klinkstatus/

    【讨论】:

      猜你喜欢
      • 2021-05-10
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-11
      相关资源
      最近更新 更多