当用户代理使用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>
答案 0 :(得分:1)
您正在使用的代码无法正常工作,因为您尝试在无Javascript环境中使用基于Javascript的重定向,即使您执行此操作,curl也不会遵循重定向curl只是按原样返回HTTP标头和响应,重定向只是一个HTTP标头。
您应该根据用户代理输出不同的MIME类型(在HTTP标头中)和不同的输出内容,而不是使用重定向。
例如,如果默认情况下您的页面返回HTML(因此返回文本/ html MIME类型),如果收到的用户代理标头与您正在使用的“curl”正则表达式匹配,则应该发送“内容类型” :application / json“MIME类型的HTTP标头,并从您的feed.json
文件输出内容,而不是页面的默认HTML输出,并在那里终止页面的执行。因此,此代码应放在服务器端代码的初始位置。
match()
返回字符串匹配的数组(而不是单个字符串),如果匹配,则返回null未找到。如果是基于用户代理的重定向到具有Javascript支持的标准浏览器的情况,则应将代码更改为if(navigator.userAgent.match(/safari/i)){ // Code goes here }
(在此示例中使用Safari作为匹配的浏览器)。另请注意,不需要调用toLowercase()
,因为您已经使用regexp末尾的“i”标记进行了不区分大小写的搜索。