javascript - 使用 JavaScript 验证和更正 URL

标签 javascript redirect

tl;dr: 用户在输入字段中输入短格式/别名 URL (website.com)。我需要找出它的长格式并替换用户的输入(可以是 www.website.comwww2.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/

相关文章:

bash - 如何在命令中使用文件并将输出重定向到同一文件而不截断它?

javascript - CefSharp 从现有的 Javascript 函数中获取结果

javascript - 使用 ng-view 并按需加载 Controller

javascript - 使用 react-infinite-scroller 创建待办事项列表

linux - 如何在 Mac OS X 下重定向时间命令输出

http - HTTP/1.1 302 到底是什么意思?

javascript - 在句子中找到一个定义长度的数字并解析它

javascript - Jquery 显示/隐藏切换 Div 选定项

typescript - 从 Angular 2 中的 Resolver 取消路由导航

php - 重定向在 Apache 中不起作用,HTTP 到 HTTPS