我们真的应该为所有传入的URL做这件事吗?
不,你不应该这样做。请求使用了非UTF8的URI组件,这不应该是你的问题。
我们应该关注哪些安全或性能方面的影响?
URI组件的编码并不是一个安全问题。通过查询字符串或路径参数进行注入尝试是一个安全问题。但那是另一个主题。在性能方面,每个中间件都会使您的响应时间变长一点儿。但我甚至都不会担心这个。如果你想自己解码URI,只需这样做。它只需要几毫秒的时间。
我们应该担心unescape在不久的将来被删除吗?
实际上,你应该这样做。unescape已过时。如果你仍然想使用它,首先检查它是否存在,i.e. 'unescape' in global
。你也可以使用内置的替代方法:require('querystring').unescape()
,它不会在每种情况下产生相同的结果,但它不会抛出URIError
。(不建议使用)。
为了最小化对搜索排名的不良影响:
确定你的Express应用程序在这些情况下返回哪个状态码。它可能是500(内部服务器错误),这将看起来很糟糕,或者是404(未找到),这将告诉爬虫你没有查询的结果(这可能并不是真的)。在这些情况下,我建议你通过返回客户端错误,如400(错误请求),来覆盖这一点,因为问题的根源是请求了一个格式不正确的URI组件,应该是UTF-8,但它不是。爬虫/机器人应该关注这个问题。
app.use(function (err, req, res, next) {
if (err instanceof URIError) {
res.status(400).send();
}
});
总之,试图针对格式错误的URI返回结果会产生其他副作用。首先,您将允许一个错误的请求 - 这不是好事:)。其次,它将意味着您有一个错误URI的结果,当网络爬虫/机器人获得200 OK响应并且它被传播时,它将被存储。然后,您将不得不处理更多错误的请求。
总而言之,不要通过unescape
进行解码。Express已经尝试通过合适的方法进行解码:decodeURIComponent
。如果失败了,就让它保持原样。