Ошибка ajax соединения

I have some Javascript JQuery code that does an Ajax call to the server every 5 mins, it's to keep the server session alive and keep the user logged in. I'm using $.ajax() method in JQuery. This fu...

I have some Javascript JQuery code that does an Ajax call to the server every 5 mins, it’s to keep the server session alive and keep the user logged in. I’m using $.ajax() method in JQuery. This function seems to have an ‘error’ property that I’m trying to use in the event that the user’s internet connection goes down so that the KeepAlive script continues to run. I’m using the following code:

var keepAliveTimeout = 1000 * 10;

function keepSessionAlive()
{
    $.ajax(
    {
        type: 'GET',
        url: 'http://www.mywebapp.com/keepAlive',
        success: function(data)
        {
            alert('Success');

            setTimeout(function()
            {
                keepSessionAlive();
            }, keepAliveTimeout);
        },
        error: function(XMLHttpRequest, textStatus, errorThrown)
        {
            alert('Failure');

            setTimeout(function()
            {
                keepSessionAlive();
            }, keepAliveTimeout);
        }
    });
}

When I run it, I’ll get ‘Success’ popup on the screen in an alert box every 10 seconds which is fine. However, as soon as I unplug the network cable, I get nothing, I was expecting the error function to get called and see a ‘Failure’ alert box, but nothing happens.

Am I correct in assuming that the ‘error’ function is only for non ‘200’ status codes returned from the server? Is there a way to detect network connection problems when making an Ajax call?

asked Nov 13, 2009 at 17:19

Sunday Ironfoot's user avatar

Sunday IronfootSunday Ironfoot

12.7k15 gold badges73 silver badges90 bronze badges

5

// start snippet
error: function(XMLHttpRequest, textStatus, errorThrown) {
        if (XMLHttpRequest.readyState == 4) {
            // HTTP error (can be checked by XMLHttpRequest.status and XMLHttpRequest.statusText)
        }
        else if (XMLHttpRequest.readyState == 0) {
            // Network error (i.e. connection refused, access denied due to CORS, etc.)
        }
        else {
            // something weird is happening
        }
    }
//end snippet

answered Feb 9, 2015 at 7:25

ToddJCrane's user avatar

3

You should just add: timeout: <number of miliseconds>, somewhere within $.ajax({}).
Also, cache: false, might help in a few scenarios.

$.ajax is well documented, you should check options there, might find something useful.

Good luck!

answered Nov 13, 2009 at 20:14

Krule's user avatar

KruleKrule

6,4683 gold badges34 silver badges56 bronze badges

1

Since I can’t duplicate the issue I can only suggest to try with a timeout on the ajax call. In jQuery you can set it with the $.ajaxSetup (and it will be global for all your $.ajax calls) or you can set it specifically for your call like this:

$.ajax({
    type: 'GET',
    url: 'http://www.mywebapp.com/keepAlive',
    timeout: 15000,
    success: function(data) {},
    error: function(XMLHttpRequest, textStatus, errorThrown) {}
})

JQuery will register a 15 seconds timeout on your call; after that without an http response code from the server jQuery will execute the error callback with the textStatus value set to «timeout». With this you can at least stop the ajax call but you won’t be able to differentiate the real network issues from the loss of connections.

Ravi Kumar Gupta's user avatar

answered Nov 13, 2009 at 20:30

Marco Z's user avatar

Marco ZMarco Z

5882 gold badges5 silver badges15 bronze badges

What I see in this case is that if I pull the client machine’s network cable and make the call, the ajax success handler is called (why, I don’t know), and the data parameter is an empty string. So if you factor out the real error handling, you can do something like this:

function handleError(jqXHR, textStatus, errorThrown) {
    ...
}

jQuery.ajax({
    ...
    success: function(data, textStatus, jqXHR) {
        if (data == "") handleError(jqXHR, "clientNetworkError", "");
    },
    error: handleError
});

answered Jul 22, 2011 at 15:43

Geoff's user avatar

GeoffGeoff

4653 silver badges5 bronze badges

If you are making cross domain call the Use Jsonp. else the error is not returned.

answered Apr 3, 2013 at 8:10

Swapnil Rebello's user avatar

USE

xhr.onerror = function(e){
    if (XMLHttpRequest.readyState == 4) {
        // HTTP error (can be checked by XMLHttpRequest.status and XMLHttpRequest.statusText)
        selFoto.erroUploadFoto('Erro HTTP: '+XMLHttpRequest.statusText);
    }
    else if (XMLHttpRequest.readyState == 0) {
        // Network error (i.e. connection refused, access denied due to CORS, etc.)
        selFoto.erroUploadFoto('Erro de rede:'+XMLHttpRequest.statusText);
    }
    else {
        selFoto.erroUploadFoto('Erro desconhecido.');
    }

};

(more code below — UPLOAD IMAGE EXAMPLE)

var selFoto = {
   foto: null,

   upload: function(){
        LoadMod.show();

        var arquivo = document.frmServico.fileupload.files[0];
        var formData = new FormData();

        if (arquivo.type.match('image.*')) {
            formData.append('upload', arquivo, arquivo.name);

            var xhr = new XMLHttpRequest();
            xhr.open('POST', 'FotoViewServlet?acao=uploadFoto', true);
            xhr.responseType = 'blob';

            xhr.onload = function(e){
                if (this.status == 200) {
                    selFoto.foto = this.response;
                    var url = window.URL || window.webkitURL;
                    document.frmServico.fotoid.src = url.createObjectURL(this.response);
                    $('#foto-id').show();
                    $('#div_upload_foto').hide();           
                    $('#div_master_upload_foto').css('background-color','transparent');
                    $('#div_master_upload_foto').css('border','0');

                    Dados.foto = document.frmServico.fotoid;
                    LoadMod.hide();
                }
                else{
                    erroUploadFoto(XMLHttpRequest.statusText);
                }

                if (XMLHttpRequest.readyState == 4) {
                     selFoto.erroUploadFoto('Erro HTTP: '+XMLHttpRequest.statusText);
                }
                else if (XMLHttpRequest.readyState == 0) {
                     selFoto.erroUploadFoto('Erro de rede:'+XMLHttpRequest.statusText);                             
                }

            };

            xhr.onerror = function(e){
            if (XMLHttpRequest.readyState == 4) {
                // HTTP error (can be checked by XMLHttpRequest.status and XMLHttpRequest.statusText)
                selFoto.erroUploadFoto('Erro HTTP: '+XMLHttpRequest.statusText);
            }
            else if (XMLHttpRequest.readyState == 0) {
                 // Network error (i.e. connection refused, access denied due to CORS, etc.)
                 selFoto.erroUploadFoto('Erro de rede:'+XMLHttpRequest.statusText);
            }
            else {
                selFoto.erroUploadFoto('Erro desconhecido.');
            }
        };

        xhr.send(formData);
     }
     else{
        selFoto.erroUploadFoto('');                         
        MyCity.mensagens.push('Selecione uma imagem.');
        MyCity.showMensagensAlerta();
     }
  }, 

  erroUploadFoto : function(mensagem) {
        selFoto.foto = null;
        $('#file-upload').val('');
        LoadMod.hide();
        MyCity.mensagens.push('Erro ao atualizar a foto. '+mensagem);
        MyCity.showMensagensAlerta();
 }
 };

AgataB's user avatar

AgataB

6472 gold badges10 silver badges18 bronze badges

answered Sep 1, 2016 at 12:36

MalucOJonnes's user avatar

0

here’s what I did to alert user in case their network went down or upon page update failure:

  1. I have a div-tag on the page where I put current time and update this tag every 10 seconds. It looks something like this: <div id="reloadthis">22:09:10</div>

  2. At the end of the javascript function that updates the time in the div-tag, I put this (after time is updated with AJAX):

    var new_value = document.getElementById('reloadthis').innerHTML;
    var new_length = new_value.length;
    if(new_length<1){
        alert("NETWORK ERROR!");
    }
    

That’s it! You can replace the alert-part with anything you want, of course.
Hope this helps.

Brad Gilbert's user avatar

Brad Gilbert

33.6k11 gold badges80 silver badges127 bronze badges

answered Mar 20, 2011 at 20:10

kummik's user avatar

Have you tried this?

$(document).ajaxError(function(){ alert('error'); }

That should handle all AjaxErrors. I´ve found it here.
There you find also a possibility to write these errors to your firebug console.

answered Nov 13, 2009 at 20:15

MaikL80's user avatar

Добрый вечер дорогие форумчане. Подскажите пожалуйста, почему при попытке отправить ajax запрос, у меня выскакивает alert из error??? Всю голову уже сломал, весь интернет уже перерыл.
2) И почему после того как я нажимаю ок в alert у меня перезагружается страница??

шаблон

{% extends "crm/main_struct.html" %}
{% load staticfiles %}

{% block content %}

<!--ОБЯЗАТЕЛЬНО СДЕЛАТЬ ФУНКЦИЮ НА JS КОТОРАЯ БУДЕТ ВЫЧИСЛЯТЬ ОТСТУПЫ И В НУЖНОЕ МЕСТО ПИХАТЬ КОНТЕНТ САЙТОВ-->
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>

<script>
$(document).ready(function() {
  $('ul.tabs_m_w').each(function() {
    $(this).find('li').each(function(i) {
      $(this).click(function() {
        $(this).addClass('active').siblings().removeClass('active');
        var p = $(this).parents('div.tabs_container_m_w');
        p.find('div.tab_container_m_w').hide();
        p.find('div.tab_container_m_w:eq(' + i + ')').show();
      });
    });
  });
})
</script>
<a href="{{url}}/crm/my_work/new/" class="add_notebook_a">
    <div class="add_notebook">Добавить</div>
</a>
<div class="tabs_container_m_w">
  <ul class="tabs_m_w">
      {% for notebook in notebookList %}
        <li class="inl-bl_m_w">
            <div class="m_w_list_head">{{notebook.name}}</div>
            <div class="m_w_list_date">{{notebook.date_firstly}}</div>
            <div class="m_w_list_kr_info">{{notebook.kr_info}}</div>
        </li>
      {% endfor %}
  </ul>

    {% for notebook in notebookList %}
  <div class="tab_container_m_w">
      <a href="" onclick="resend({{notebook.id}});" class="a_tab">
          <div class="m_w_save">
            Сохранить
          </div>
      </a>
    <div class="m_w_info_head" id="name{{notebook.id}}" contentEditable="true">{{notebook.name}}</div>
      <div class="m_w_info_info" id="info{{notebook.id}}" contentEditable="true">{{notebook.information}}</div>
  </div>
{% endfor %}

</div>

<script>
    function resend(pk){
           var name = document.getElementById('name' + pk).innerHTML.trim().replace(/<.*?>/g, "");
           var info = document.getElementById('info' + pk).innerHTML.trim().replace(/<.*?>/g, "");
           edit(name, info, pk);
    }
</script>

<script>
function edit(name, info, pk) {
// Если поля заполнены, отправляем их значения
        $.ajax({
            error: function() {
                alert('Ошибка получения запроса');
            },
    // При успехе очищаем поля и меняем кнопочку
                success: function(data) {
                 alert("Успех"); // для проверки, что скрипт работает
                },
    // CSRF механизм защиты Django
                beforeSend: function(xhr, settings) {
                    console.log('-------------before send--');
                    function getCookie(name) {
                        var cookieValue = null;
                        if (document.cookie && document.cookie != '') {
                            var cookies = document.cookie.split(';');
                            for (var i = 0; i < cookies.length; i++) {
                                var cookie = jQuery.trim(cookies[i]);
                                // Does this cookie string begin with the name we want?
                            if (cookie.substring(0, name.length + 1) == (name + '=')) {
                                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                                break;
                            }
                        }
                    }
                    return cookieValue;
                    }
                    if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
                        // Only send the token to relative URLs i.e. locally.
                        xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
                    }
                }
            });// ajax


        return false;
    };
</script>
{% endblock %}

urls.py

urlpatterns = patterns('',
    url(r'^my_work/edit/$', views.NBEdit, name='crm_edit_NB'),
)

views.py

def NBEdit(request):
    if request.is_ajax():
        for i in MyDela.objects.filter(pk=request.POST.get("id", "")):
            i.name = request.POST.get("name", "")[:250]
            i.information = request.POST.get("info", "")
            i.save()
        #  return HttpResponse("ok")
        return HttpResponseRedirect('/crm/sites/')
    else:
        #  return HttpResponse("bad")
        return HttpResponseRedirect('/crm/zayvki/')

Прошу не кидаться помидорами, я только учусь кодить))

Can you post the signature of your method that is supposed to accept this post?

Additionally I get the same error message, possibly for a different reason. My YSOD talked about the dictionary not containing a value for the non-nullable value.
The way I got the YSOD information was to put a breakpoint in the $.ajax function that handled an error return as follows:

<script type="text/javascript" language="javascript">
function SubmitAjax(url, message, successFunc, errorFunc) {
    $.ajax({
        type:'POST',
        url:url,
        data:message,
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        success:successFunc,
        error:errorFunc
        });

};

Then my errorFunc javascript is like this:

function(request, textStatus, errorThrown) {
        $("#install").text("Error doing auto-installer search, proceed with ticket submissionn"
        +request.statusText); }

Using IE I went to view menu -> script debugger -> break at next statement.
Then went to trigger the code that would launch my post. This usually took me somewhere deep inside jQuery’s library instead of where I wanted, because the select drop down opening triggered jQuery. So I hit StepOver, then the actual next line also would break, which was where I wanted to be. Then VS goes into client side(dynamic) mode for that page, and I put in a break on the $("#install") line so I could see (using mouse over debugging) what was in request, textStatus, errorThrown. request. In request.ResponseText there was an html message where I saw:

<title>The parameters dictionary contains a null entry for parameter 'appId' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ContentResult CheckForInstaller(Int32)' in 'HLIT_TicketingMVC.Controllers.TicketController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.<br>Parameter name: parameters</title>

so check all that, and post your controller method signature in case that’s part of the issue

Can you post the signature of your method that is supposed to accept this post?

Additionally I get the same error message, possibly for a different reason. My YSOD talked about the dictionary not containing a value for the non-nullable value.
The way I got the YSOD information was to put a breakpoint in the $.ajax function that handled an error return as follows:

<script type="text/javascript" language="javascript">
function SubmitAjax(url, message, successFunc, errorFunc) {
    $.ajax({
        type:'POST',
        url:url,
        data:message,
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        success:successFunc,
        error:errorFunc
        });

};

Then my errorFunc javascript is like this:

function(request, textStatus, errorThrown) {
        $("#install").text("Error doing auto-installer search, proceed with ticket submissionn"
        +request.statusText); }

Using IE I went to view menu -> script debugger -> break at next statement.
Then went to trigger the code that would launch my post. This usually took me somewhere deep inside jQuery’s library instead of where I wanted, because the select drop down opening triggered jQuery. So I hit StepOver, then the actual next line also would break, which was where I wanted to be. Then VS goes into client side(dynamic) mode for that page, and I put in a break on the $("#install") line so I could see (using mouse over debugging) what was in request, textStatus, errorThrown. request. In request.ResponseText there was an html message where I saw:

<title>The parameters dictionary contains a null entry for parameter 'appId' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ContentResult CheckForInstaller(Int32)' in 'HLIT_TicketingMVC.Controllers.TicketController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.<br>Parameter name: parameters</title>

so check all that, and post your controller method signature in case that’s part of the issue

This is a tutorial on how to handle errors when making Ajax requests via the jQuery library. A lot of developers seem to assume that their Ajax requests will always succeed. However, in certain cases, the request may fail and you will need to inform the user.

Here is some sample JavaScript code where I use the jQuery library to send an Ajax request to a PHP script that does not exist:

$.ajax({
     url: 'does-not-exist.php',
     success: function(returnData){
         var res = JSON.parse(returnData);
     },
     error: function(xhr, status, error){
         var errorMessage = xhr.status + ': ' + xhr.statusText
         alert('Error - ' + errorMessage);
     }
});

If you look at the code above, you will notice that I have two functions:

  • success: The success function is called if the Ajax request is completed successfully. i.e. If the server returns a HTTP status of 200 OK. If our request fails because the server responded with an error, then the success function will not be executed.
  • error: The error function is executed if the server responds with a HTTP error. In the example above, I am sending an Ajax request to a script that I know does not exist. If I run the code above, the error function will be executed and a JavaScript alert message will pop up and display information about the error.

The Ajax error function has three parameters:

  • jqXHR
  • textStatus
  • errorThrown

In truth, the jqXHR object will give you all of the information that you need to know about the error that just occurred. This object will contain two important properties:

  • status: This is the HTTP status code that the server returned. If you run the code above, you will see that this is 404. If an Internal Server Error occurs, then the status property will be 500.
  • statusText: If the Ajax request fails, then this property will contain a textual representation of the error that just occurred. If the server encounters an error, then this will contain the text “Internal Server Error”.

Obviously, in most cases, you will not want to use an ugly JavaScript alert message. Instead, you would create an error message and display it above the Ajax form that the user is trying to submit.

JQuery 3.0: The error, success and complete callbacks are deprecated.

Update: As of JQuery 3.0, the success, error and complete callbacks have all been removed. As a result, you will have to use the done, fail and always callbacks instead.

An example of done and fail being used:

$.ajax("submit.php")
  .done(function(data) {
      //Ajax request was successful.
  })
  .fail(function(xhr, status, error) {
      //Ajax request failed.
      var errorMessage = xhr.status + ': ' + xhr.statusText
      alert('Error - ' + errorMessage);
})

Note that always is like complete, in the sense that it will always be called, regardless of whether the request was successful or not.

Hopefully, you found this tutorial to be useful.

By Rod McBride

jQuery has a lot of methods to define and process AJAX requests in a convenient fashion, but one useful feature added to jQuery in version 1.0 is often overlooked by developers. 

The ajaxError() method is a method that can serve as a centralized place for AJAX request error handling. In general, unexpected server responses are handled similarly as on a web page, such as when a notification or a modal dialogue appears to tell the user that something unexpected happened and the operation has failed. 

By looking at the jQuery documentation for the AJAX convenience methods, like $.post and $.get, we notice that we can attach callback methods to successful and failed AJAX calls. 

$.post(«/api/sendStuff», function () {

    //… handle success

}).fail(function () {

    //… handle failure and display notification

});

Having a way to handle errors on individual AJAX calls is a great way to fine-tune your JavaScript and deal with specific error scenarios close to their occurrences. However, being aware of a centralized AJAX error-handling routine could avoid scenarios similar to this:

$.post(«/api/operationA», function(){

   //…

}).fail(function(jqXHR, textStatus, error){

   handleError(error);

});

$.post(«/api/operationB», function(){

   //…

}).fail(function(jqXHR, textStatus, error){

   handleError(error);

});

$.post(«/api/operationC», function(){

   //…

}).fail(function(jqXHR, textStatus, error){

   handleError(error);

});

In this scenario, the developer created a sophisticated, dynamic, single-page application driven by a collection of AJAX requests and wrote a method that processes errors thrown by those AJAX requests. Technically, there isn’t anything wrong with this solution. However, it isn’t the most elegant approach and causes a lot of repeated code fragments. 

We can get rid of all the redundant fail callbacks by defining the default behavior of the page in case an AJAX exception occurs with ajaxError(). The method needs to be attached to the document object and will serve as a centralized processing place for those types of AJAX scenarios:

$(document).ajaxError(function( event, jqxhr, settings, thrownError ) {

   handleError(error);

});

This global handler will always fire upon an error situation regardless if there is a defined local fail callback. Consequently, the following code fragment will display both error notifications at the same time:

$(document).ajaxError(function( event, jqxhr, settings, thrownError ) {

   showErrorNotificationA(error);

});

$.post(«/api/operationA», function(){

   //…

}).fail(function(jqXHR, textStatus, error){

   showErrorNotificationB(error);

});

To suppress the global error handler and prevent duplicate notifications requires adding some additional logic that gives more control over it.

One way to accomplish this is to define a flag in the settings of the AJAX request that determines whether the global error handler should fire.

The biggest disadvantage of this approach is that you can’t use $.post() and $.get() anymore for these kinds of requests, and we need to fall back to $.ajax() that gives more granular control over the request. Here is an example:

$(document).ajaxError(function( event, jqxhr, settings, thrownError ) {

   if(!settings.suppressGlobalErrorHandler){

         handleError(error);

   }

});

$.ajax(«/api/operationA», {

   suppressGlobalErrorHandler: true,

   success: function(){

      //…

   },

   error: function(jqXHR, textStatus, error){

      //…

   }

});

If you’d like to learn more about the AJAX error handling or have other jQuery or JavaScript questions, contact the technology consultants at Wipfli. You can also keep reading more of our technology-focused articles here.

я провел много исследований и не смог найти способ справиться с этим. Я пытаюсь выполнить вызов jQuery ajax с сервера https на сервер https locahost, на котором работает причал с пользовательским самозаверяющим сертификатом. Моя проблема заключается в том, что я не могу определить, является ли ответ отказом от соединения или небезопасным ответом (Из-за отсутствия принятия сертификата). Есть ли способ определить разницу между обоими сценариями? The responseText и statusCode всегда одинаковы в обоих случаях, хотя в консоли chrome я вижу разницу:

net::ERR_INSECURE_RESPONSE
net::ERR_CONNECTION_REFUSED

responseText — это всегда «» и statusCode всегда » 0 » для обоих случаев.

мой вопрос в том, как я могу определить, не удалось ли вызвать jQuery ajax из-за ERR_INSECURE_RESPONSE или из-за ERR_CONNECTION_REFUSED?

как только сертификат принят, все работает нормально, но я хочу знать, выключен ли сервер localhost или он запущен и работает, но сертификат еще не был общепринятый.

$.ajax({
    type: 'GET',
    url: "https://localhost/custom/server/",
    dataType: "json",
    async: true,
    success: function (response) {
        //do something
    },
    error: function (xhr, textStatus, errorThrown) {
        console.log(xhr, textStatus, errorThrown); //always the same for refused and insecure responses.
    }
});

enter image description here

даже выполняя вручную запрос, я получаю тот же результат:

var request = new XMLHttpRequest();
request.open('GET', "https://localhost/custom/server/", true);
request.onload = function () {
    console.log(request.responseText);
};
request.onerror = function () {
    console.log(request.responseText);
};
request.send();

6 ответов


нет способа отличить его от новейших веб-браузеров.

спецификация W3C:

шаги ниже описывают, что должны делать агенты пользователей для простого запроса перекрестного происхождения:

применить сделать запрос шаги и соблюдать правила запроса ниже при выполнении запроса.

если флаг перенаправления вручную не установлен и ответ имеет код состояния HTTP 301, 302, 303, 307 или 308
Примените шаги перенаправления.

если пользователь отменяет запрос
Примените шаги отмены.

если есть сетевая ошибка
В случае ошибок DNS, сбоя согласования TLS или других сетевых ошибок примените действия сети ошибка. Не запрашивайте никакого взаимодействия с конечным пользователем.

Примечание: это не включает HTTP-ответы, которые указывают на некоторые тип ошибки, например код состояния HTTP 410.

иначе
Выполните проверку общего доступа к ресурсам. Если он возвращает fail, примените шаги сетевой ошибки. В противном случае, если он возвращает pass, завершите этот алгоритм и установите состояние запроса cross-origin в success. Фактически не прекращайте запрос.

как вы можете прочитать, сетевые ошибки не включают HTTP-ответ, который включает ошибки, поэтому вы всегда получите 0 как код состояния и «» как ошибка.

источник


Примечание: следующие примеры были сделаны с использованием Google Chrome версии 43.0.2357.130 и против среды, которую я создал для эмуляции OP one. Код для настройки находится в нижней части ответа.


Я думал, что подход к работе вокруг этого будет делать вторичный запрос по HTTP вместо HTTPS как ответ но я вспомнил, что это невозможно из-за того, что более новые версии браузеров блокируют смешанный контент.

это означает, что веб-браузер не будет разрешать запрос по HTTP, если вы используете HTTPS и наоборот.

это было так несколько лет назад, но более старые версии веб-браузера, такие как Mozilla Firefox ниже версии 23 позволяют это.

доказательства об этом:

создание HTTP-запроса от HTTPS usign Web Broser консоль

var request = new XMLHttpRequest();
request.open('GET', "http://localhost:8001", true);
request.onload = function () {
    console.log(request.responseText);
};
request.onerror = function () {
    console.log(request.responseText);
};
request.send();

приведет к следующей ошибке:

смешанный контент: страница в’https://localhost:8000/ ‘был загружен через HTTPS, но запросил небезопасную конечную точку XMLHttpRequest’http://localhost:8001/’. Этот запрос заблокирован; содержимое должно обслуживаться по протоколу HTTPS.

такая же ошибка появится в консоли браузера, Если вы попытаетесь сделать это другими способами, как добавление Iframe.

<iframe src="http://localhost:8001"></iframe>

использование сокета также было опубликовано в качестве ответа, я был уверен, что результат будет таким же / похожим, но я попробовал.

попытка открыть соединение сокета из веб-Broswer с помощью HTTPS к небезопасной конечной точке сокета закончится ошибками смешанного содержимого.

new WebSocket("ws://localhost:8001", "protocolOne");

1) смешанный контент: страница в’https://localhost:8000/’ был загружен через HTTPS, но попытался для подключения к небезопасной конечной точке WebSocket ‘ws:/ / localhost: 8001/’. Этот запрос заблокирован; эта конечная точка должна быть доступна через WSS.

2) Uncaught DOMException: не удалось создать «WebSocket»: небезопасное соединение WebSocket не может быть инициировано со страницы, загруженной через HTTPS.

затем я попытался подключиться к конечной точке wss, чтобы узнать, могу ли я прочитать некоторую информацию об ошибках сетевого подключения:

var exampleSocket = new WebSocket("wss://localhost:8001", "protocolOne");
exampleSocket.onerror = function(e) {
    console.log(e);
}

выполнение фрагмент выше с сервером отключен результаты:

подключение WebSocket к «wss://localhost:8001/» не удалось: ошибка в установлении соединения: net::ERR_CONNECTION_REFUSED

выполнение фрагмента выше с включенным сервером

соединение WebSocket с «wss://localhost:8001/» не удалось: рукопожатие открытия WebSocket было отменено

но опять же, ошибка, которую» функция onerror » выводит на консоль не имейте никакого подсказки, чтобы отличить одну ошибку от другой.


через прокси, как этот ответ предлагаю может работать, но только если «целевой» сервер имеет открытый доступ.

здесь это не так, поэтому попытка реализовать прокси в этом сценарии приведет нас к той же проблеме.

код для создания узла.JS HTTPS server:

Я создал два сервера HTTPS Nodejs, которые используют самозаверяющие сертификаты:

targetServer.js:

var https = require('https');
var fs = require('fs');

var options = {
    key: fs.readFileSync('./certs2/key.pem'),
    cert: fs.readFileSync('./certs2/key-cert.pem')
};

https.createServer(options, function (req, res) {
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
    res.writeHead(200);
    res.end("hello worldn");
}).listen(8001);

applicationServer.js:

var https = require('https');
var fs = require('fs');

var options = {
    key: fs.readFileSync('./certs/key.pem'),
    cert: fs.readFileSync('./certs/key-cert.pem')
};

https.createServer(options, function (req, res) {
    res.writeHead(200);
    res.end("hello worldn");
}).listen(8000);

чтобы он работал, Вам нужно установить Nodejs, нужно создать отдельные сертификаты для каждого сервера и сохранить его в папках certs и certs2 соответственно.

, чтобы запустить его просто выполнить node applicationServer.js и node targetServer.js в терминале (пример ubuntu).


сейчас: нет никакого способа отличить это событие от browers. Поскольку браузеры не предоставляют разработчикам доступ к событию. (июль 2015 года)

этот ответ просто стремится предоставить идеи для потенциального, albiet hacky и неполного решения.


предупреждение: этот ответ является неполным, так как не полностью решить проблемы OP (из-за политики перекрестного происхождения). Однако сама идея имеет некоторые заслуги, которые далее расширяются: @artur grzesiak здесь, используя прокси и ajax.


после довольно небольшого исследования, кажется, нет никакой формы проверки ошибок для разницы между отказом от соединения и небезопасным ответом, по крайней мере, в том, что касается javascript, предоставляющего ответ на разницу между ними.

общий консенсус моего исследования заключается в том, что SSL-сертификаты обрабатываются браузер, поэтому до тех пор, пока самозаверяющий сертификат не будет принят пользователем, браузер блокирует все запросы, в том числе для кода состояния. Браузер может (если закодирован) отправить обратно свой собственный код состояния для небезопасного ответа, но это ничего не поможет, и даже тогда у вас будут проблемы с совместимостью браузера (chrome/firefox/IE, имеющие разные стандарты… еще раз)

Так как ваш первоначальный вопрос был для проверки состояния вашего сервера между по сравнению с недопустимым сертификатом, не могли бы вы сделать стандартный HTTP-запрос таким образом?

isUp = false;
isAccepted = false;

var isUpRequest = new XMLHttpRequest();
isUpRequest.open('GET', "http://localhost/custom/server/", true); //note non-ssl port
isUpRequest.onload = function() {
    isUp = true;
    var isAcceptedRequest = new XMLHttpRequest();
    isAcceptedRequest.open('GET', "https://localhost/custom/server/", true); //note ssl port
    isAcceptedRequest.onload = function() {
        console.log("Server is up and certificate accepted");
        isAccepted = true;
    }
    isAcceptedRequest.onerror = function() {
        console.log("Server is up and certificate is not accepted");
    }
    isAcceptedRequest.send();
};
isUpRequest.onerror = function() {
    console.log("Server is down");
};
isUpRequest.send();

конечно, для этого требуется дополнительный запрос для проверки подключения сервера, но он должен выполнить работу путем исключения. Тем не менее, я все еще чувствую себя хакером, и я не большой поклонник двойного запроса.


ответ@Schultzie довольно близок, но ясно http — В общем — не получится из https в среде браузера.

что вы можете сделать, это использовать промежуточный сервер (Прокси), чтобы сделать запрос от вашего имени. Прокси-сервер должен разрешить пересылку http запрос от https origin или загрузить содержимое из самоподписанный происхождение.

наличие собственного сервера с соответствующим сертификатом, вероятно, является излишним в вашем случае — как вы могли бы использовать этот параметр вместо машины с самозаверяющий сертификат, но есть много анонимные открытые прокси-сервисов там.

Итак, два подхода, которые приходят мне на ум:

  1. ajax запрос — в таком случае прокси должен использовать соответствующие настройки CORS
  2. использование iframe — вы загружаете свой скрипт (возможно, завернутый в html) внутри iframe через прокси. Однажды загруженный скрипт отправляет сообщение своему .parentWindow. Если ваше окно получило сообщение, вы можете быть уверены, что сервер работает (или, точнее, был запущен за долю секунды до этого).

если вас интересует только локальная среда, Вы можете попробовать запустить chrome с помощью --disable-web-security флаг.


другое предложение: вы пытались загрузить изображение программно, чтобы узнать, есть ли там больше информации?



к сожалению, современный браузер XHR API не предоставляет явного указания на то, когда браузер отказывается подключаться из-за «небезопасного ответа», а также когда он не доверяет сертификату HTTP/SSL веб-сайта.

но есть способы обойти эту проблему.

одно решение, которое я придумал, чтобы определить, когда браузер не доверяет сертификату HTTP / SSL, — это сначала определить, произошла ли ошибка XHR (используя jQuery error() обратный звонок для экземпляр), затем проверьте, является ли вызов XHR URL-адресом » https://», а затем проверьте, является ли XHR readyState равно 0, что означает, что соединение XHR даже не было открыто (что происходит, когда браузеру не нравится сертификат).

вот код, где я это делаю:
https://github.com/maratbn/RainbowPayPress/blob/e9e9472a36ced747a0f9e5ca9fa7d96959aeaf8a/rainbowpaypress/js/le_requirejs/public/model_info__transaction_details.js#L88


Я не думаю, что в настоящее время есть способ обнаружить эти сообщения об ошибках, но хак, который вы можете сделать, это использовать сервер, такой как nginx перед вашим сервером приложений, так что если сервер приложений не работает, вы получите плохую ошибку шлюза от nginx с 502 код состояния, который вы можете обнаружить в JS. В противном случае, если сертификат недействителен, вы все равно получите ту же общую ошибку с statusCode = 0.


AJAX позволяет отправить и получить данные без перезагрузки страницы. Например, делать проверку форм, подгружать контент и т.д. А функции JQuery значительно упрощают работу.

Полное описание функции AJAX на jquery.com.

1

GET запрос

Запрос идет на index.php с параметром «text» и значением «Текст» через метод GET.
По сути это то же самое что перейти в браузере по адресу – http://site.com/index.php?text=Текст

В результате запроса index.php вернет строку «Данные приняты – Текст», которая будет выведена в сообщении alert.

$.ajax({
	url: '/index.php',         /* Куда пойдет запрос */
	method: 'get',             /* Метод передачи (post или get) */
	dataType: 'html',          /* Тип данных в ответе (xml, json, script, html). */
	data: {text: 'Текст'},     /* Параметры передаваемые в запросе. */
	success: function(data){   /* функция которая будет выполнена после успешного запроса.  */
		alert(data);            /* В переменной data содержится ответ от index.php. */
	}
});

JS

Код можно сократить используя функцию $.get

$.get('/index.php', {text: 'Текст'}, function(data){
	alert(data);
});

JS

Код файла index.php

echo 'Данные приняты - ' . $_GET['text'];

PHP

GET запросы могут кэшироваться браузером или сервером, чтобы этого избежать нужно добавить в функцию параметр – cache: false.

$.ajax({
	url: '/index.php',
	method: 'get',
	cache: false
});

JS

2

POST запросы

$.ajax({
	url: '/index.php',
	method: 'post',
	dataType: 'html',
	data: {text: 'Текст'},
	success: function(data){
		alert(data);
	}
});

JS

Или сокращенная версия – функция $.post

$.post('/index.php', {text: 'Текст'}, function(data){
	alert(data);
});

JS

Код файла index.php

echo 'Данные приняты - ' . $_POST['text'];

PHP

POST запросы ни когда не кэшироваться.

3

Отправка формы через AJAX

При отправке формы применяется функция serialize(), подробнее на jquery.com.

Она обходит форму и собирает названия и заполненные пользователем значения полей и возвращает в виде массива – {login: 'ЗНАЧЕНИЯ_ПОЛЯ', password: 'ЗНАЧЕНИЯ_ПОЛЯ'}.

Особенности serialize():

  • Кнопки формы по которым был клик игнорируются, в результате функции их не будет.
  • serialize можно применить только к тегу form и полям формы, т.е. $('div.form_container').serialize(); – вернет пустой результат.

Пример отправки и обработки формы:

<div class="form_container">
	<div id="message"></div>
	<form id="form">
		<input type="text" name="login">
		<input type="text" name="password">
		<input type="submit" name="send" value="Отправить">
	</form>
</div>

<script>
$("#form").on("submit", function(){
	$.ajax({
		url: '/handler.php',
		method: 'post',
		dataType: 'html',
		data: $(this).serialize(),
		success: function(data){
			$('#message').html(data);
		}
	});
});
</script>

HTML

Код файла handler.php

if (empty($_POST['login'])) {
	echo 'Укажите логин';
} elseif (empty($_POST['password'])) {
	echo 'Укажите пароль';
} else {
	echo 'Авторизация...';
}

PHP

4

Работа с JSON

Идеальный вариант когда нужно работать с массивами данных.

$.ajax({
	url: '/json.php',
	method: 'get',
	dataType: 'json',
	success: function(data){
		alert(data.text);    /* выведет "Текст" */
		alert(data.error);   /* выведет "Ошибка" */
	}
});

JS

Короткая версия

$.getJSON('/json.php', function(data) {
	alert(data.text);
	alert(data.error);
});

JS

$.getJSON передает запрос только через GET.

Код файла json.php

header('Content-Type: application/json');

$result = array(
	'text'  => 'Текст',
	'error' => 'Ошибка'
);

echo json_encode($result);

PHP

Возможные проблемы

При работе с JSON может всплыть одна ошибка – после запроса сервер отдал результат, все хорошо, но метод success не срабатывает. Причина кроется в серверной части (PHP) т.к. перед данными могут появится управляющие символы, например:

Управляющие символы в ответе JSON

Из-за них ответ считается не валидным и считается как ошибочный запрос.

В таких случаях помогает очистка буфера вывода ob_end_clean (если он используется на сайте).

...

// Очистка буфера
ob_end_clean(); 
		
header('Content-Type: application/json');
echo json_encode($result, JSON_UNESCAPED_UNICODE);
exit();

PHP

5

Выполнение JS загруженного через AJAX

В JQuery реализована функция подгруздки кода JS через AJAX, после успешного запроса он будет сразу выполнен.

$.ajax({
	method: 'get',
	url: '/script.js',
	dataType: "script"
});

JS

Или

$.getScript('/script.js');

JS

6

Дождаться выполнения AJAX запроса

По умолчанию в JQuery AJAX запросы выполняются асинхронно. Т.е. запрос не задерживает выполнение программы пока ждет результатов, а работает параллельно.

Простой пример:

var text = '';

$.ajax({
	url: '/index.php',
	method: 'get',
	dataType: 'html',
	success: function(data){
		text = data;
	}
});

alert(text);  /* Переменная будет пустая. */

JS

Переменная text будет пустая, а не как ожидается текст который вернул index.php

Чтобы включить синхронный режим нужно добавить параметр async: false.
Соответственно синхронный запрос будет вешать прогрузку страницы если код выполняется в <head> страницы.

var text = '';

$.ajax({
	url: '/index.php',
	method: 'get',
	dataType: 'html',
	async: false,
	success: function(data){
		text = data;
	}
});

alert(text); /* В переменной будет результат из index.php. */

JS

7

Отправка HTTP заголовков

Через AJAX можно отправить заголовки HEAD, они указываются в параметре headers.

$.ajax({
	url: '/index.php',
	method: 'get',
	dataType: 'html',
	headers: {'Token_value': 123},
	success: function(data){
		console.dir(data);
	}
});

JS

В PHP они будут доступны в массиве $_SERVER, ключ массива переводится в верхний регистр с приставкой HTTP_, например:

<?php
echo $_SERVER['HTTP_TOKEN_VALUE']; // 123

PHP

8

Обработка ошибок

Через параметр error задается callback-функция, которая будет вызвана в случаи если запрашиваемый ресурс отдал 404, 500 или другой код.

$.ajax({
	url: '/index.php',
	method: 'get',
	dataType: 'json',
	success: function(data){
		console.dir(data);
	},
	error: function (jqXHR, exception) {
		if (jqXHR.status === 0) {
			alert('Not connect. Verify Network.');
		} else if (jqXHR.status == 404) {
			alert('Requested page not found (404).');
		} else if (jqXHR.status == 500) {
			alert('Internal Server Error (500).');
		} else if (exception === 'parsererror') {
			alert('Requested JSON parse failed.');
		} else if (exception === 'timeout') {
			alert('Time out error.');
		} else if (exception === 'abort') {
			alert('Ajax request aborted.');
		} else {
			alert('Uncaught Error. ' + jqXHR.responseText);
		}
	}
});

JS

Через $.ajaxSetup можно задать обработчик ошибок для всех AJAX-запросов на сайте.

$.ajaxSetup({
	error: function (jqXHR, exception) {
		...
	}
});

JS

За последние 24 часа нас посетил 9001 программист и 591 робот. Сейчас ищут 277 программистов …


  1. NightWos

    С нами с:
    11 мар 2017
    Сообщения:
    8
    Симпатии:
    0

    Добрый день друзья/товарищи. Весь интернет перерыл, ответа на свой вопрос не нашел. Прошу помощи… У меня ajax срабатывает раз через раз. Бывает и 10 обращений — моментальные, отличные, а бывает валится в 500/504 ошибку.
    Сразу error.log

    1. 2017/03/11 20:50:57 [error] 2310#2310: *11925 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 78.106.237.241, server: x-linkpay.com, request: «POST /actions/site_edit_banner.php HTTP/1.1», upstream: «https://5.187.5.231:8443/actions/site_edit_banner.php», host: «x-linkpay.com», referrer: «https://x-linkpay.com/cabinet/edit_banner/296»

    Сам ajax:

    1.   $(‘#submit’).click(function() {
    2.     var id = ‘<?php echo $getid; ?>’;
    3.     var url = $(‘#url’).val();
    4.     var cost = $(‘#cost’).val();
    5.     var cat = $(‘#cat’).val();
    6.     var how = $(‘#how’).val();
    7.     var bn_width = $(‘#bn_width’).val();
    8.     var bn_height = $(‘#bn_height’).val();
    9.     var bn_zagl = $(‘#bn_zagl’).val();
    10.       url: ‘/actions/site_edit_banner.php’,
    11.       success: function(result) {
    12.           $().toastmessage(‘showErrorToast’, «Не заполнены все необходимые поля»);
    13.           $().toastmessage(‘showSuccessToast’, «Успешно»);
    14.           $(location).attr(‘href’, ‘/cabinet’);
    15.           $().toastmessage(‘showErrorToast’, «Вы не авторизованы»);
    16.           $().toastmessage(‘showErrorToast’, «Ошибка»);
    17.           $().toastmessage(‘showErrorToast’, «Неверный адрес сайта»);
    18.           $().toastmessage(‘showErrorToast’, «Этот сайт уже есть в системе»);

    php Обработчик:

    1. include(‘../inc/conf.php’);
    2. ini_set(‘session.use_cookies’, ‘On’);
    3. ini_set(‘session.use_trans_sid’, ‘Off’);
    4. if (!isset($_SESSION[«uid»]) || $_SESSION[«uid»] != 301){
    5. if(isset($_POST[‘id’]) && isset($_POST[‘url’]) && isset($_POST[‘ti’]) && isset($_POST[‘cost’]) && isset($_POST[‘cat’]) && isset($_POST[‘how’]) && isset($_POST[‘bn_width’]) && isset($_POST[‘bn_height’]) && isset($_POST[‘bn_zagl’])){
    6. if(!empty($_POST[‘id’]) && !empty($_POST[‘url’]) && !empty($_POST[‘ti’]) && !empty($_POST[‘cost’]) && !empty($_POST[‘cat’]) && !empty($_POST[‘how’]) && !empty($_POST[‘bn_width’]) && !empty($_POST[‘bn_height’]) && !empty($_POST[‘bn_zagl’])){
    7. $uid = intval($_SESSION[«uid»]);
    8. if ($lr === false) { echo ‘4’; exit; }
    9. $file = «../thumbs/$dt.jpg»;
    10. $surl = «http://mini.s-shot.ru/1024×768/800/jpeg/?$url«;
    11. mysqli_query($connect_db, «UPDATE `t_site` SET `url` = ‘$url‘, `ti` = ‘$ti‘, `cat` = ‘$cat‘, `cost` = ‘$cost‘, `how` = ‘$how‘, `bn_width` = ‘$bn_width‘, `bn_height` = ‘$bn_height‘, `bn_zagl` = ‘$bn_zagl‘ WHERE id=’$id‘ LIMIT 1″);

    До кучи .htacces

    1. RewriteCond %{QUERY_STRING} (<|%3C).*script.*(>|%3E) [NC,OR]
    2. RewriteCond %{QUERY_STRING} GLOBALS(=|[|%[0-9A-Z]{0,2}) [OR]
    3. RewriteCond %{QUERY_STRING} _REQUEST(=|[|%[0-9A-Z]{0,2})
    4. RewriteRule ^(.*)$ index.php [F,L]
    5. <FilesMatch «.(flv|gif|jpg|jpeg|png|ico|swf|js|css|pdf)$»>
    6. Header set Cache-Control «max-age=2592000»
    7. AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/css text/javascript application/javascript application/x-javascript
    8. mod_gzip_item_include file      .(html?|txt|css|js|php|pl)$
    9. mod_gzip_item_include mime      ^text.*
    10. mod_gzip_item_include mime      ^application/x-javascript.*
    11. mod_gzip_item_exclude mime      ^image.*
    12. mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
    13. <FilesMatch «.(html|htm)$»>
    14. Header set Cache-Control «max-age=43200»
    15. <FilesMatch «.(js|css|txt)$»>
    16. Header set Cache-Control «max-age=604800»
    17. <FilesMatch «.(flv|swf|ico|gif|jpg|jpeg|png)$»>
    18. Header set Cache-Control «max-age=2592000»
    19. <FilesMatch «.(pl|php|cgi|spl|scgi|fcgi)$»>
    20. Header unset Cache-Control
    21. ExpiresDefault «access plus 5 seconds»
    22. ExpiresByType image/x-icon «access plus 2592000 seconds»
    23. ExpiresByType image/jpeg «access plus 2592000 seconds»
    24. ExpiresByType image/png «access plus 2592000 seconds»
    25. ExpiresByType image/gif «access plus 2592000 seconds»
    26. ExpiresByType application/x-shockwave-flash «access plus 2592000 seconds»
    27. ExpiresByType text/css «access plus 604800 seconds»
    28. ExpiresByType text/javascript «access plus 604800 seconds»
    29. ExpiresByType application/javascript «access plus 604800 seconds»
    30. ExpiresByType application/x-javascript «access plus 604800 seconds»
    31. ExpiresByType text/html «access plus 43200 seconds»
    32. ExpiresByType application/xhtml+xml «access plus 600 seconds»
    33. RewriteCond %{REQUEST_FILENAME} !-d
    34. RewriteCond %{REQUEST_FILENAME}.php -f
    35. RewriteRule ^(.*)$ $1.php
    36. RewriteRule ^m_admin/user/(.*?)$ m_admin/user.php?login=$1 [L,QSA]
    37. RewriteRule ^m_admin/ad_single/(.*?)$ m_admin/ad_single.php?id=$1 [L,QSA]
    38. RewriteRule ^m_admin/edit/(.*?)$ m_admin/edit.php?id=$1 [L,QSA]
    39. RewriteRule ^m_admin/view/(.*?)$ m_admin/view.php?id=$1 [L,QSA]
    40. RewriteRule ^m_admin/moderation/(.*?)$ m_admin/moderation.php?id=$1 [L,QSA]
    41. RewriteRule ^m_admin/sitestat/(.*?)$ m_admin/sitestat.php?id=$1 [L,QSA]
    42. RewriteRule ^m_admin/adstat/(.*?)$ m_admin/adstat.php?id=$1 [L,QSA]
    43. RewriteRule ^site/(.*?)$ site.php?id=$1 [L,QSA]
    44. RewriteRule ^goto/(.*?)$ goto.php?id=$1 [L,QSA]
    45. RewriteRule ^fromto/(.*?)$ fromto.php?id=$1 [L,QSA]
    46. RewriteRule ^cabinet/site/(.*?)$ cabinet/site.php?id=$1 [L,QSA]
    47. RewriteRule ^cabinet/sitestat/(.*?)$ cabinet/sitestat.php?id=$1 [L,QSA]
    48. RewriteRule ^cabinet/adstat/(.*?)$ cabinet/adstat.php?id=$1 [L,QSA]
    49. RewriteRule ^cabinet/edit_string/(.*?)$ cabinet/edit_string.php?id=$1 [L,QSA]
    50. RewriteRule ^cabinet/edit_link/(.*?)$ cabinet/edit_link.php?id=$1 [L,QSA]
    51. RewriteRule ^cabinet/edit_banner/(.*?)$ cabinet/edit_banner.php?id=$1 [L,QSA]
    52. RewriteRule ^m_admin/edit_string/(.*?)$ m_admin/edit_string.php?id=$1 [L,QSA]
    53. RewriteRule ^m_admin/edit_link/(.*?)$ m_admin/edit_link.php?id=$1 [L,QSA]
    54. RewriteRule ^m_admin/edit_banner/(.*?)$ m_admin/edit_banner.php?id=$1 [L,QSA]
    55. RewriteRule ^cabinet/ticket/(.*?)$ cabinet/ticket.php?id=$1 [L,QSA]
    56. RewriteRule ^m_admin/ticket/(.*?)$ m_admin/ticket.php?id=$1 [L,QSA]
    57. RewriteCond %{HTTP_HOST} ^www.(.+) [NC]
    58. RewriteRule .* http://%1/$0 [L,R=301]

    Я прошу… нет, МОЛЮ! О помощи, голову себе всю изломал уже.


  2. igordata

    Команда форума
    Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.415
    Симпатии:
    1.768

    Отваливается апстрим. Видимо, это пхп. Он молчит и ничего не отвечает. Это может быть в случае, если он входит в долгий цикл, который не закачивается дольше, чем веб-сервер готов ждать.


  3. NightWos

    С нами с:
    11 мар 2017
    Сообщения:
    8
    Симпатии:
    0

    А какое есть возможное решение этой проблемы ?


  4. igordata

    Команда форума
    Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.415
    Симпатии:
    1.768

    Найти, где в коде затык. До куда обрабатывает, а дальше не идёт.


  5. igordata

    Команда форума
    Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.415
    Симпатии:
    1.768

    а что делает скрипт, и зачем он куда-то в интернет лазиет? Может он оттуда долго ждёт ответа, поэтому висит.


  6. NightWos

    С нами с:
    11 мар 2017
    Сообщения:
    8
    Симпатии:
    0

    В интернет для создания скриншота/миниатюры сайта


  7. igordata

    Команда форума
    Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.415
    Симпатии:
    1.768

    надо проверить, сколько у него это занимает.


  8. NightWos

    С нами с:
    11 мар 2017
    Сообщения:
    8
    Симпатии:
    0

    Дело в том что на др. хостинге скрипт работает отлично.
    Сейчас на VDS я с ТП общался, они говорили в htacces что-то не верно, а именно:

    1. RewriteCond %{REQUEST_FILENAME} !-d
    2. RewriteCond %{REQUEST_FILENAME}.php -f
    3. RewriteRule ^(.*)$ $1.php

    Вроде какие то настройки на VDS сделали, проблема осталась актуальной, но воспроизводится намного реже.
    Так что возможно либо htacces, либо какие то настройки VDS ? Я именно в настройки под исполнение php скриптов в VDS вообще не разбираюсь…


  9. igordata

    Команда форума
    Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.415
    Симпатии:
    1.768

    я как со стеной говорю =)
    ты тупо игноришь то, чего не понимаешь, и ищешь там, где светлее, а не там, где ключи обронил.

    Ты должен замерить время выполнения разных кусков скрипта. Хоть через каждую строку натыйкай мерялку. Но ты долен знать какая часть скрипта тормозит. И вот только если не тормозит никакая — тогда можно идти ковырять конфиг апача…


  10. igordata

    Команда форума
    Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.415
    Симпатии:
    1.768


  11. NightWos

    С нами с:
    11 мар 2017
    Сообщения:
    8
    Симпатии:
    0

    Не знаю как это взаимо связанно, но проблема решилась настройкой ответа сервера о том что кэшировать результаты не нужно:

    1.  Header set Cache-Control «max-age=0, no-cache, no-store, must-revalidate»
    2. Header set Pragma «no-cache»
    3. Header set Expires «Wed, 11 Jan 1984 05:00:00 GMT»

    Спасибо огромное за участие!


  12. igordata

    Команда форума
    Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.415
    Симпатии:
    1.768

    ты чтоли не сохранял превьюшку, а каждый раз дёргал тот сервис? при каждом выводе картинки?


  13. NightWos

    С нами с:
    11 мар 2017
    Сообщения:
    8
    Симпатии:
    0

    Нет, превью сохраняется в папке, тут из кода видно:

    1. $file = «../thumbs/$dt.jpg»;
    2. $surl = «http://mini.s-shot.ru/1024×768/800/jpeg/?$url»;
    3. $content = file_get_contents($surl);
    4. file_put_contents($file, $content);

    Тот сервис дергается при добавлении нового сайта, либо при редактировании.


  14. igordata

    Команда форума
    Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.415
    Симпатии:
    1.768

    странно, короче.

    хорошо, что всё решилось, но странно.


  15. NightWos

    С нами с:
    11 мар 2017
    Сообщения:
    8
    Симпатии:
    0

    Да, тут все странно. Сам голову ломал. Но уверен 100% что в htacces собака зарыта )


  16. igordata

    Команда форума
    Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.415
    Симпатии:
    1.768

    я думаю, что htaccess не может давать 500 ошибку в такой ситуации =)

Понравилась статья? Поделить с друзьями:
  • Ошибка 999 при переводе
  • Ошибка ajax как исправить
  • Ошибка 999 на фискальном регистраторе атол
  • Ошибка ajax запроса что это
  • Ошибка 999 на терминале