当用户代理卷曲时,从浏览器返回不同的响应

时间:2017-03-03 07:13:22

标签: javascript json curl user-agent http-get

当用户代理使用javascript卷曲时,如何从浏览器返回不同的响应?

例如:

if user agent is curl
 return /feed.json
else
 return index.html

这是我的代码,但是当我运行命令curl http://example.com时,它只返回html响应

<script>
      function browserRedirect(){
        var userAgent = navigator.userAgent.toLowerCase();
        console.log(userAgent);
        var curl = userAgent.match(/curl|PycURL/i) == "curl";
        var chrome = userAgent.match(/chrome/i) == "chrome";

        // Check that the user agent is curl
        if(curl) {
          window.location.href = "/feed.json"
        }
      }

      browserRedirect()
</script>

1 个答案:

答案 0 :(得分:1)

您正在使用的代码无法正常工作,因为您尝试在无Javascript环境中使用基于Javascript的重定向,即使您执行此操作,curl也不会遵循重定向curl只是按原样返回HTTP标头和响应,重定向只是一个HTTP标头。

您应该根据用户代理输出不同的MIME类型(在HTTP标头中)和不同的输出内容,而不是使用重定向。

例如,如果默认情况下您的页面返回HTML(因此返回文本/ html MIME类型),如果收到的用户代理标头与您正在使用的“curl”正则表达式匹配,则应该发送“内容类型” :application / json“MIME类型的HTTP标头,并从您的feed.json文件输出内容,而不是页面的默认HTML输出,并在那里终止页面的执行。因此,此代码应放在服务器端代码的初始位置。

BTW,作为对Javascript代码的观察而不考虑此上下文,IF块永远不会运行,因为match()返回字符串匹配的数组(而不是单个字符串),如果匹配,则返回null未找到。如果是基于用户代理的重定向到具有Javascript支持的标准浏览器的情况,则应将代码更改为if(navigator.userAgent.match(/safari/i)){ // Code goes here }(在此示例中使用Safari作为匹配的浏览器)。另请注意,不需要调用toLowercase(),因为您已经使用regexp末尾的“i”标记进行了不区分大小写的搜索。