tl;dr: 用户在输入字段中输入短格式/别名 URL (website.com
)。我需要找出它的长格式并替换用户的输入(可以是 www.website.com
或 www2.website.com
- 这取决于重定向) .
--
我有一个 Web 服务,用户可以在输入字段中输入 URL。提交后,我的 Web 服务会定期向该 URL 发送 GET/POST 请求(从服务器),并对返回的数据进行处理。
我遇到的问题是用户有时会输入短格式 URL。例如,他们输入 washingtonpost.com
而不是 https://www.washingtonpost.com
。在浏览器中导航到该 URL 时(常规浏览期间)这不是问题,因为浏览器会自动重定向到 https://www.washingtonpost.com
。问题是,在服务器端处理重定向逻辑被证明是相当困惑的,我想避免它。
我正在寻找一种方法来“验证”用户在输入字段中输入的 URL。我考虑过在所有输入的 URL 前面加上 www
(如果他们还没有的话),但并非所有网站都有。例如,有些使用 www2
,而另一些则不使用它。据我所知,可靠地找出“最终”URL 的唯一方法是监听重定向并从响应中获取 location
值。
我考虑过使用 JavaScript 向其发送 GET 请求来验证 URL,解析响应,如果 statusCode
是重定向(301、302 等),则将 URL 替换为带有位置
的输入字段。
问题在于 CORS。我在控制台中收到此错误:
XMLHttpRequest cannot load https://washingtonpost.com/. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://myservice.com' is therefore not allowed access.`
完成这项任务的最佳方法是什么?如果可能的话,我想使用 JavaScript。
最佳答案
这对于 Javascript 来说是不可能的,因为 Javascript 对这些情况施加了安全措施。
最接近的方法是创建一个 iframe 并加载 URL,但在跨域重定向的情况下,iframe 不允许您检查其 location.href
另一种可能的尝试是使用 AJAX
请求,但这需要在目标服务器中启用 CORS,但在您的情况下不可能这样做,因为用户可以输入任何 URL。
所以基本上您正在寻找的解决方案必然会破坏浏览器中的跨域安全策略,因此最好在后端进行检查。
<小时/>如果您无法在后端执行此操作
无论如何,都有启用 CORS 并公开其服务的代理服务器。只要您的要求不暴露任何私有(private)数据,您就可以重用他们的服务。以下是 cors-anywhere
的示例,并使用 header 中提供的自定义最终 url ( X-Final-Url )。 无论如何你都必须添加一个协议(protocol)http/https
$.ajaxPrefilter( function (options) {
if (options.crossDomain && jQuery.support.cors) {
var http = (window.location.protocol === 'http:' ? 'http:' : 'https:');
options.url = http + '//cors-anywhere.herokuapp.com/' + options.url;
//options.url = "http://cors.corsproxy.io/url=" + options.url;
}
});
$.ajax({
type: 'HEAD', //'GET'
url:'http://washingtonpost.com',
success: function(data, textStatus, request){
console.log(request.getResponseHeader('X-Final-Url'));
},
error: function (request, textStatus, errorThrown) {
console.log(request.getResponseHeader('X-Final-Url'));
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
关于javascript - 使用 JavaScript 验证和更正 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40233523/