【问题标题】:Return different response from the browser when the User Agent is curl当用户代理是 curl 时,从浏览器返回不同的响应
【发布时间】:2017-07-23 04:56:30
【问题描述】:

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

例如:

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>

【问题讨论】:

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


    【解决方案1】:

    当您尝试在 curl 的无 Javascript 环境中使用基于 Javascript 的重定向时,您使用的代码将不起作用,即使您这样做,curl 也不会遵循重定向curl 只是按原样返回 HTTP 标头和响应,重定向只是一个 HTTP 标头。

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-07-11
      • 2011-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      • 2014-02-08
      相关资源
      最近更新 更多