javascript - 当用户代理是curl时,从浏览器返回不同的响应

标签 javascript json curl user-agent http-get

当用户代理使用 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 的环境(curl)上使用基于 Javascript 的重定向时,您使用的代码将无法工作,即使您这样做,curl 也不会遵循重定向,因为curl 只是按原样返回 HTTP header 和响应,重定向只是一个 HTTP header 。

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

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

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

关于javascript - 当用户代理是curl时,从浏览器返回不同的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42572820/

相关文章:

c - Ubuntu - #include <curl/curl.h> 没有这样的文件或目录

linux - curl 特定 header 的 "write out"值

javascript - 如何正确解决jquery冲突

javascript - 根据复选框选择显示随机文本 (javascript)

javascript - 异步资源加载完成后会触发什么 Javascript 事件?

javascript - JSON 将字符串而不是数组或对象从 PHP 传递到 Javascript

Android:解析具有大属性且内存使用率低的 JSON 文件

android - 即使按照实际程序也无法解析android中的json数据

json - 如何使用 Go 标准库替换流中的字节?

javascript - 将 cURL 请求转换为 Javascript 时遇到问题