jQuery. AJAX 未使用HTTPS

4bbkushb  于 2022-11-22  发布在  jQuery
关注(0)|答案(3)|浏览(258)

因此,我使用. AJAX 方法从jQuery调用一个Web服务。调用该方法的页面是一个HTTPS/SSL页面,但是当进行调用时,jQuery不断发出HTTP请求,并且它失败了,因为服务器被设置为将所有HTTP流量重定向到HTTPS...所以返回了301错误。
我已经检查了我的代码一百万次,尝试了一百万种方法来生成 AJAX 查询的url参数。(使用//表示相对,现在只是将https协议附加到url的开头。下面是我的javascript:

function add_inbound_record(serial_number, pass_fail_value)
{
   pfv = pass_fail_value.toUpperCase();
   url = location.protocol + "//" + location.hostname + "/inbound/record-                 inspection/" + serial_number + "/" + pfv;
   $.ajax({
   url:url,
   cache:false,
   });
}

因此,当这段代码执行时,我检查了firebug中的url参数,它正确地显示了https和正确格式的URL。然而,当我执行 AJAX 函数时,我在firebug中看到了这样的情况:

301 MOVED PERMANENTLY

192.168.1.9

20 B

192.168.1.9:443

Response Headersview source
Connection  keep-alive
Content-Encoding    gzip
Content-Length  20
Content-Type    text/html; charset=utf-8
Date    Wed, 24 Oct 2012 17:33:34 GMT
Location    http://192.168.1.9/inbound/record-inspection/011234567890123421000000002995/P/?_=1351100020609
Server  nginx/1.1.19
Vary    Accept-Encoding

Request Headersview source
Accept  */*
Accept-Encoding gzip, deflate
Accept-Language en-us,en;q=0.5
Connection  keep-alive
Cookie  djdt=hide; csrftoken=sF9RUxrlS6IKURxOryH2d2yT05gMighn;         sessionid=9682390da4011e445931643c81be9aae
Host    192.168.1.9
Referer https://192.168.1.9/fingerprint/inspect/
User-Agent  Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101     Firefox/15.0.1
X-Requested-With    XMLHttpRequest

正如你从上面的引用中看到的,协议是HTTPS,但是响应头中的位置是HTTP?我一辈子都弄不明白为什么请求是以HTTP而不是HTTPS的形式通过网络。301响应是准确的,因为它是以HTTP的形式通过的,因为Web服务器被配置为只允许HTTPS访问。有什么想法吗?

mkshixfv

mkshixfv1#

好的。我花了4个多小时来处理这个问题,当我在URL的末尾加了一个斜线后,这个问题就消失了,一切都正常了。我不知道为什么。Web服务器/Web服务不需要斜线来正常工作,但是不管什么原因,这就是“修复”它的原因。谢谢你们的帮助。

示例请注意双斜线

之前:https://somedomain.com//requests/get-requests.html?lang=ar
(固定后):https://somedomain.com/requests/get-requests.html?lang=ar

**更新:**问题回到我的意思是后,它成为工作时,我删除斜线!

这个答案也拯救了我

6tdlim6h

6tdlim6h2#

我也对同样的问题感到非常不安。我正在从我的SSL页面发送 AJAX 请求,如下所示:
第一个
问题是,请求标头显示引用页面是一个ssl页面,但响应标头显示的位置是一个“http”页面,如上面Rob的代码printscreen所示。
我开始了解到,每次当你从一个ssl页面发出 AJAX 请求时,响应会出现在同一个页面,即ssl页面,当你从非ssl页面发出ajax请求时,响应也会出现在同一个非ssl页面。这是ajax请求和响应的默认规则。
我想,肯定是我的代码出了问题,在发送https时,强制从http做出响应。确切地说,我的怀疑是对的。实际上有一个默认代码,强制重定向到http页面而不是https。我分享前面的代码:

class Custom_Customplugins extends Zend_Controller_Plugin_Abstract
    {
        public function preDispatch(Zend_Controller_Request_Abstract $request)
        {
        $action = $request->getActionName();
        $controller = $request->getControllerName();
        $module = $request->getModuleName();

        $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
        $host = $_SERVER['HTTP_HOST'];
        if($host != "www.xyz.com")
        {
            if($protocol == "http://")
            {

            }
        }
        else
        {
            $r = new Zend_Controller_Action_Helper_Redirector();
            $u = new Zend_Controller_Action_Helper_Url();
            if(
            ($action == "index" && $controller == "index" && $module == "default") 
            || ($action == "login" && $controller == "index" && $module == "default")
            || ($action == "businessownerregistration" && $controller == "index" && $module == "default")
            || ($action == "customerregistration" && $controller == "index" && $module == "default")
            || ($action == "index" && $controller == "changepwd" && $module == "admin") 
            || ($action == "index" && $controller == "businessowner" && $module == "businessowner") 
            || ($action == "changepwd" && $controller == "serviceprovider" && $module == "businessowner")
            || ($action == "index" && $controller == "customer" && $module == "default")    
              )
            {
            if($protocol == "http://")
            {
                $r->gotoUrl('https://'.$host.$u->url(array("action"=>$action, "controller"=>$controller, "module"=>$module)))->redirectAndExit();
            }
            }
            else
            {
            if($protocol == "https://")
            {
                $r->gotoUrl('http://'.$host.$u->url(array("action"=>$action, "controller"=>$controller, "module"=>$module)))->redirectAndExit();
            }
            }
        }
        }
    }

更正后代码为:

<?php
    class Custom_Customplugins extends Zend_Controller_Plugin_Abstract
    {
        public function preDispatch(Zend_Controller_Request_Abstract $request)
        {
        $action = $request->getActionName();
        $controller = $request->getControllerName();
        $module = $request->getModuleName();

        $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
        $host = $_SERVER['HTTP_HOST'];
        if($host != "www.xyz.com")
        {
            if($protocol == "http://")
            {

            }
        }
        else
        {
            $r = new Zend_Controller_Action_Helper_Redirector();
            $u = new Zend_Controller_Action_Helper_Url();
            if(
            ($action == "index" && $controller == "index" && $module == "default") 
            || ($action == "login" && $controller == "index" && $module == "default")
            || ($action == "businessownerregistration" && $controller == "index" && $module == "default")
            || ($action == "customerregistration" && $controller == "index" && $module == "default")
            || ($action == "index" && $controller == "changepwd" && $module == "admin") 
            || ($action == "index" && $controller == "businessowner" && $module == "businessowner") 
            || ($action == "changepwd" && $controller == "serviceprovider" && $module == "businessowner")
            || ($action == "index" && $controller == "customer" && $module == "default")    
              )
            {
            if($protocol == "http://")
            {
                $r->gotoUrl('https://'.$host.$u->url(array("action"=>$action, "controller"=>$controller, "module"=>$module)))->redirectAndExit();
            }
            }
            else if(
                ($action == "autocomplete" && $controller == "ajax" && $module == "default")
                || ($action == "refreshcaptcha" && $controller == "index" && $module == "default")
               )
            {

            }
            else
            {
            if($protocol == "https://")
            {
                $r->gotoUrl('http://'.$host.$u->url(array("action"=>$action, "controller"=>$controller, "module"=>$module)))->redirectAndExit();
            }
            }
        }
        }
    }

?>

现在,我的https页面工作正常

kqqjbcuj

kqqjbcuj3#

这是当你谷歌这个问题时出现的问题之一,所以这可能对未来的读者有帮助。
我不知道根本原因,但根据我自己的经验,每当我多次遇到这个问题,我有一个网址,有许多符号(或分隔符)在一起,它会打破每当它试图消除他们。我不知道这是故意的或一个bug
发生这种情况的示例:(使用XMLHttpRequest(),但原理相同)

const url_test = `https://foo.bar.faz/api/api_call/${api_parameter}/${api_parameter2}/${params}`;

xhttp.open("GET", url_test, true);
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

console_log(url_test); // https://foo.bar.faz/api/api_call/1/2/?get=param&get2=param2&
xhttp.send(); // http://foo.bar.faz/api/api_call/1/2?get=param&get2=param2& <-- request sent to this URL, causing a mixed content error

为了解决这个问题,我不得不更改Laravel(因为它是我当前使用的框架)路由,在末尾添加/ajax,这样在进行调用时,符号&?就不会在一起。

const url_test = `https://foo.bar.faz/api/api_call/${api_parameter}/${api_parameter2}/ajax${params}`;

xhttp.open("GET", url_test, true);
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

console_log(url_test); // https://foo.bar.faz/api/api_call/1/2/ajax?get=param&get2=param2&
xhttp.send(); // https://foo.bar.faz/api/api_call/1/2/ajax?get=param&get2=param2 <-- request sent to this URL

就像我说的,我不知道这是一个错误还是只是一个未记录的行为,但这是什么为我工作,我希望它会帮助其他人有同样的问题。

相关问题