我正在尝试从Firebase Cloud函数ping网站
部署时,它在小型网站上失败:返回10s超时,HTTP代码403,HTTP代码508…
注意:
-云功能执行成功-没有错误消息被打印
-它在本地运行时工作良好(使用模拟器(
-它在针对大型网站(如google.com(时工作良好
发生了什么事
是否是反DDOS软件阻止了来自Firebase IP的请求
运行函数的服务器的IP在多次调用中是否保持不变
欢迎任何帮助,我在黑暗中。。。
编辑:这是一个最小的示例:功能:
// file functions/index.js
const axios = require("axios");
const functions = require("firebase-functions");
exports.poke = functions.https.onCall(async (data, context) => {
try {
const res = await axios({ method: "get", url: data.url });
return { status: res.status, headers: res.headers };
} catch (error) {
if (error.response) {
return { status: error.response.status, headers: error.response.headers };
}
return `error: ${error.message}`;
}
});
客户:
// file index.html
<html>
<body>
<form id="form1">
<input id="input1" />
<button type="submit">test</button>
</form>
<script src="/__/firebase/7.22.1/firebase-app.js"></script>
<script src="/__/firebase/7.22.1/firebase-functions.js"></script>
<script src="/__/firebase/init.js"></script>
<script>
if (location.hostname === "localhost") {
console.log("running in emulators");
firebase.functions().useFunctionsEmulator("http://localhost:5001");
}
document.getElementById("form1").addEventListener("submit", async function (event) {
event.preventDefault();
const url = document.getElementById("input1").value;
const res = await firebase.functions().httpsCallable("poke")({ url });
console.log(res);
});
</script>
</body>
</html>
URL失败的示例:https://fff.fr
在本地运行时,它会打印:{ data: {status: 200, headers: ...}
部署运行时,有时会打印:{ data: { status: 403, headers: ...}
不会显示任何错误消息,响应标头中似乎没有任何相关内容。
在Firebase控制台日志中,我们可以看到该功能执行成功,它打印:
poke
Function execution took 1161 ms, finished with status code: 200
我确认一些站点检测到我的请求来自数据中心,并且没有很好地回复。在本地运行时不会发生这种情况,因为在这种情况下,我的请求是从我的家庭IP发出的。通过代理解决了这个问题。