测试是不是可以从 Web 浏览器访问 URL,即确保没有被代理服务器阻止

Posted

技术标签:

【中文标题】测试是不是可以从 Web 浏览器访问 URL,即确保没有被代理服务器阻止【英文标题】:Test if URL is accessible from web browser i.e. make sure not blocked by Proxy server测试是否可以从 Web 浏览器访问 URL,即确保没有被代理服务器阻止 【发布时间】:2011-08-03 01:31:03 【问题描述】:

我从 mywebsite.com 为我的网站提供服务。我在 flickr 上托管图像,因此所有图像都通过对 flickr 的获取请求加载到用户的浏览器中。我的许多网站用户从公司网络访问 mywebsite.com,这会阻止访问 flickr.com。这意味着用户会得到非常烦人的空白占位符而不是图像。 Facebook like 按钮也有同样的问题。这使我的网站看起来对这些用户没有吸引力。

有没有办法可以运行客户端脚本来检查是否可以访问 flickr.com、facebook.com 等。如果不是,我可以更改图像的 href 属性以从备用源加载,或者用标准图像替换,说明他们的网络正在阻止访问。我还可以删除 Facebook 的赞按钮。

我认为 XML http 请求可以解决问题,但我认为我会遇到跨域问题。我想我也可以设置一个代理来提供图像,但我不想这样做;这样做的想法是 flickr 会占用带宽。

TLDR:如何使用客户端技术确定是否可以从用户的浏览器访问 flickr.com。

【问题讨论】:

【参考方案1】:

对于 facebook,您可以简单地包含 Facebook JS API,然后测试它导出的对象/函数之一是否存在。

如果您不(ab-)使用外部主机来存放您的东西会更好。如果你想要一个 CDN,最好使用一个真实的......

【讨论】:

谢谢 - 我不认为我在滥用外部主机... flickr 社区指南说他们很乐意在您的网站上展示您的照片,只要您将图片链接回来。这就是我正在做的 - 它们是照片,而不是模板图形等,我同意这是我的问题。【参考方案2】:

你可以试试这个……

var image = new Image();

image.onerror = function() 

   var images = document
                 .getElementById('flicker-images')
                 .getElementsByTagName('img');

   for (var i = 0, imagesLength = images.length; i < imagesLength; i++) 
        images[i].src = 'images/flickr_is_blocked.gif';
   

;

image.src = 'http://flickr.com/favicon.ico';

Hacky,但它似乎工作。但是它依赖于favicon.ico 404ing 表示主站点。

jsFiddle.

【讨论】:

这看起来是一个很好的解决方案——我没想过这样做。因此,onerror 处理程序可以用“flickr_is_blocked.gif”替换我所有的图像 href 属性。今晚会试一试并反馈。谢谢。 @planetjones 是的,事实上,假设您的意思是src 属性,我会对其进行编辑以使其做到这一点:) 是的,就是这个!虽然我可能会从封闭的锚点中删除 href (或完全删除锚点!),因为单击它不会让用户走得太远!再次感谢 - 我认为这会很好地解决问题 这里有一个有趣的现象。在 Internet Explorer(至少 v8)中,如果您使用 image.src = 'flickr.com/favicon.ico';然后它会调用 onerror 处理程序,即使 favicon 是可访问的。在将 .ico 文件检索到图像中时,IE 似乎会引发错误。所以我的建议是始终检查真实的图像格式,即我只是指向我在 flickr 上的 .jpg 谢谢。确认上面的 jsFiddle 在最新版本的 FF(10)、Chrome(17) 和 IE(9) 中工作。【参考方案3】:

Flickr 和 Facebook 都有支持 JSONP 的 API,因此跨域不是问题。 即,这是一个仅从 flickr 的 API 回显一些虚拟数据的请求。

$.ajax(
  url: "http://www.flickr.com/services/rest/?jsoncallback=?",
  dataType: 'json',
  data: method: "fickr.test.echo", format: "json", api_key: "02de950d65ec54a7a057af0e992de790",
  success: callback
);

您无法在 jsonp 请求上可靠地设置错误处理程序,因此在调用成功回调之前显示“正在加载”图像。设置一些超时,如果响应没有足够快地返回,则会显示错误消息。

【讨论】:

【参考方案4】:

工作示例:http://jsfiddle.net/peeter/pW5wB/

JS:

$(document).ready(function() 

    var callbackOnSuccess = function(src) 
        alert("Successfully loaded " + src);
        return false;
    ;
    var callbackOnFailure = function(src) 

        alert("Failed loading " + src);

        // Here you can do whatever you want with your flickr images. Lets change the src and alt tags
        $(".flickr").attr("src", "flickr_is_blocked.gif");
        $(".flickr").attr("alt", "Flicker is blocked");
        // Lets change the parents href to #
        $(".flickr").parent().removeAttr("href");
        return false;
    ;

    checkAvailability("http://flickr.com/favicon.ico", callbackOnSuccess, callbackOnFailure);


);

function checkAvailability(src, callbackSuccess, callbackFailure) 
    $("<img/>").attr("src", src).load(function() 
        callbackSuccess(src);
    ).error(function() 
        callbackFailure(src);
    );

html

<a href="http://flickr.com/favicon.ico">
    <img class="flickr" src="http://flickr.com/favicon.ico" />
</a>

【讨论】:

感谢 Peeter - 我想这是一个很好的 JQuery 方式。我没有考虑做的是图像加载的错误处理程序。 你可以像load(callback)这样放置回调。 你是对的,alex,完成 :) @planetjones:我更新了答案,现在应该更清楚了。 @Peeter 对不起,我又来了:P。您最好使用removeAttr('href') 使a 元素处于非活动状态。 使用了 removeAttr (我一直认为 href 是必需的属性,但谷歌搜索证明我错了),但将包装回调添加回匿名函数中。出于某种原因,您提议的版本调用了这两个回调。【参考方案5】:

这可行,但必须设置超时!

$.ajax(
    url: "http://example.com/ping.html",
    type: 'GET',
    dataType: 'jsonp',
    jsonpCallback: 'jsonCallback',
    timeout: 1000,
    cache: false,
    success: function(response) 
        console.log("SERVER UP!");
    ,
    error: function(e) 
        console.log("SERVER DOWN!");
    
);

ping.html 应该返回:

jsonCallback(response:'PONG');

【讨论】:

以上是关于测试是不是可以从 Web 浏览器访问 URL,即确保没有被代理服务器阻止的主要内容,如果未能解决你的问题,请参考以下文章

Web性能压力测试工具——Siege详解

如何通过url方式从自己的服务器上下载文件?

从正在运行的后台服务访问浏览器 url?

浏览器/web-缓存知识点梳理

Flutter Web:从 URL 下载文件而不打开它

Web Storage API : LocalStroage