8

そのため、.ajax メソッドを使用して jQuery から Web サービスを呼び出しています。メソッドを呼び出しているページは HTTPS/SSL ページですが、呼び出しが行われると、jQuery は HTTP 要求を作成し続け、サーバーがすべての HTTP トラフィックを HTTPS にリダイレクトするように設定されているため失敗します...つまり 301エラーが返ってきます。

コードを 100 万回検査し、ajax クエリの url パラメーターを生成するために 100 万通りの方法を試しました。(//を相対に使用し、URLの先頭にプロトコルhttpsを追加するだけです。これが私の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 ですか? リクエストがHTTPSではなくHTTPとしてネットワークを通過する理由を、私の人生では理解できません。301 応答は、Web サーバーが HTTPS アクセスのみを許可するように構成されているため、HTTP として送信されることを考えると正確です。何か案は?

4

3 に答える 3

26

Ok。私はこれを4時間以上いじり、URLの末尾にスラッシュを追加するとすぐに問題は解決し、すべてが正常に機能します。理由はわかりません。Webサーバー/Webサービスは、正しく機能するためにスラッシュを必要としませんが、何らかの理由で、それが「修正」されたものです。有益なコメントをありがとう。

于 2012-10-24T21:57:08.573 に答える
1

私も同じ問題について非常に怒っていました。次のように、sslページからajaxリクエストを送信していました。

$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || 

$_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";

<script type="text/javascript">
    $.ajax({ 
          url: "<?php echo $protocol.$_SERVER['HTTP_HOST'].$this->url(array("action"=>"autocomplete", "controller"=>"ajax", "module"=>"default"));?>",
                    data: { term: $("#keyword").val()},
                    dataType: "json",
                    type: "POST",
                    success: function(data){
                        response(data);
                    }
                });

</script>

問題は、要求ヘッダーはリファラー ページが ssl ページであることを示していますが、応答ヘッダーは上記の Rob のコード printscreen のように「http」ページの場所を示していることです。

SSLページからajaxリクエストを行うたびに、同じページ、つまりsslページの応答が返され、非sslページからajaxリクエストを行うと、応答によって同じページが返されることがわかりました。非 SSL ページ。これは ajax リクエストとレスポンスのデフォルト ルールです。

httpsからの送信中にhttpからの応答を強制する私のコード側に間違いなく問題があるに違いないと思います。まさに、私の疑いは正しかった。実際には、https ではなく http ページへの応答に強制的にリダイレクトするデフォルトのコードがありました。以前のコードを共有しています:

    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ページは正常に機能しています

于 2013-05-16T05:48:05.460 に答える
0

これは、この問題をググったときに表示される質問の 1 つであるため、今後の読者に役立つ可能性があります。

根本的な原因はわかりませんが、私自身の経験では、この問題に何度も直面したときはいつでも、多くの記号 (または区切り記号) を一緒に含む URL があり、それらを削除しようとすると壊れてしまいます。意図的なものなのかバグなのかはわかりません。

これが発生した例: (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

この問題を修正するために、呼び出しを行うときに/ajaxシンボル&?が一緒にならないように、Laravel (現在使用しているフレームワークであるため) ルートを最後に追加するように変更する必要がありました。

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

私が言ったように、それがバグなのか、単に文書化されていない動作なのかはわかりませんが、これは私にとってうまくいったことであり、同じ問題を抱えている他の人に役立つことを願っています.

于 2022-01-18T20:07:33.830 に答える