使用JavaScript

时间:2016-10-25 07:09:43

标签: javascript redirect

tl; dr:用户在输入字段(website.com)中输入短格式/别名网址。我需要找出它的长格式并替换用户的输入(可以是www.website.comwww2.website.com - 它取决于重定向)。

-

我有一个Web服务,用户可以在输入字段中输入URL。提交后,我的Web服务会定期将GET / POST请求(从服务器)发送到该URL,并对返回的数据进行处理。

我遇到的问题是用户有时会输入短格式网址。例如,他们输入washingtonpost.com而不是https://www.washingtonpost.com。在浏览器中导航到该URL时(在常规浏览期间),这不是问题,因为浏览器会自动跟随重定向到https://www.washingtonpost.com。问题是在服务器端处理重定向逻辑被证明是相当混乱的,我想避免它。

我正在寻找一种方法来验证"用户输入到输入字段的URL。我想过将www添加到所有已输入的网址中,如果他们已经没有,但并非所有网站都有。有些人使用www2,而其他人则不使用它。唯一的方法(我知道)可靠地找出" final" URL用于侦听重定向并从响应中获取location值。

我考虑通过使用JavaScript向其发送GET请求,解析响应以及statusCode是重定向(301,302等)来验证URL,替换输入字段中的URL使用location

问题是CORS。我在控制台中收到此错误:

  

XMLHttpRequest无法加载https://washingtonpost.com/。 No' Access-Control-Allow-Origin'标头出现在请求的资源上。起源' https://myservice.com'因此不允许访问。

完成此任务的最佳方法是什么?如果可能,我想使用JavaScript。

1 个答案:

答案 0 :(得分:1)

使用Javascript无法做到这一点,因为Javascript会对这些情况施加安全措施。

您最接近的是创建iframe并加载网址,但如果跨域重定向,iframe将无法检查其location.href

另一种可能的尝试可能是使用AJAX请求,但这需要在目标服务器中启用CORS,在您的情况下您不可能这样做,因为用户可以输入任何URL。

基本上,您正在寻找的解决方案必然会破坏浏览器中的跨域安全策略,因此最好在后端进行检查。

如果您无法在后端执行此操作

无论如何都有启用CORS并公开其服务的代理服务器。只要您的要求不公开任何私人数据,您就可以重复使用他们的服务。以下是cors-anywhere的示例,并使用其标题(X-Final-Url)中提供的自定义最终网址。 您必须添加协议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>