Удалить Ajax работает в localhost - но не в хостинге

У меня действительно странная ошибка.

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

код:

<!-- Bootstrap core JavaScript
    ================================================== -->
    <!-- Placed at the end of the document so the pages load faster -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>

    <script src="//cdn.datatables.net/1.10.9/js/jquery.dataTables.min.js"></script>
    <script src="https://cdn.datatables.net/1.10.9/js/dataTables.bootstrap.min.js"></script>
    <script src="https://cdn.datatables.net/responsive/2.0.0/js/dataTables.responsive.min.js"></script>

    <script>
      $.ajaxSetup({
          headers: {
              'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
          }
      });
    </script>    

        <script type="text/javascript">
        var theGrid = null;
        $(document).ready(function(){
            theGrid = $('#thegrid').DataTable({
                "processing": true,
                "serverSide": true,
                "ordering": true,
                "responsive": true,
                "ajax": "http://eindeks.000webhostapp.com/przedmioties/grid",
                "columnDefs": [
                    {
                        "render": function ( data, type, row ) {
                            return '<a href="#" onclick="location.href='http://eindeks.000webhostapp.com/przedmioties/'+row[0]+''; return false;">'+data+'</a>';
                        },
                        "targets": 1
                    },
                    {
                        "render": function ( data, type, row ) {
                            return '<a href="#" onclick="location.href='http://eindeks.000webhostapp.com/przedmioties/'+row[0]+'/edit'; return false;" class="btn btn-default">Zaktualizuj</a>';
                        },
                        "targets": 4                    },
                    {
                        "render": function ( data, type, row ) {
                            return '<a href="#" onclick="return doDelete('+row[0]+')" class="btn btn-danger">Usuń</a>';
                        },
                        "targets": 4+1
                    },
                ]
            });
        });
        function doDelete(id) {
            if(confirm('Naprawdę chcesz usunąć ten wpis?')) {
               $.ajax({ url: 'http://eindeks.000webhostapp.com/przedmioties/' + id, type: 'DELETE'}).success(function() {
                theGrid.ajax.reload();
               });
            }
            return false;
        }
    </script>

То же самое происходит на локальном конце (например, $.ajax({ url: 'http://localhost/dziennik/public/przedmioties/' + id, type: 'DELETE'}))

Но, как вы видите, есть Ajax с DataTables, и он хорошо работает как на хостинге, так и на localhost.

Но удаление не работает на моем веб-сайте хостинга.

Почему? Я не знаю, и я не могу понять.

Об этом коде я думаю:

function doDelete(id) {
            if(confirm('Naprawdę chcesz usunąć ten wpis?')) {
               $.ajax({ url: 'http://eindeks.000webhostapp.com/przedmioties/' + id, type: 'DELETE'}).success(function() {
                theGrid.ajax.reload();
               });
            }
            return false;
        }

Но на самом деле, это точно то же самое (url different) на моем localhost, в котором он работает. Но на хостинге это не так.

Хорошо, посмотрим на запросы из браузера...

Localhost:

введите описание изображения здесь

Да, выглядит хорошо, нормально и работает. Ницца!

Но что на хостинге?

введите описание изображения здесь

Что... Это так странно. Просто, я смотрю на это и понятия не имею, что происходит.

Здесь нет ответа:

введите описание изображения здесь

И этот запрос xhr не удался:

введите описание изображения здесь

введите описание изображения здесь

Ajax-запрос тот же, код тот же, база данных такая же, оба конца маршрута работают... Я не могу понять это.

Итак, в чем проблема?

Ответ 1

Вполне возможно, что ваш сервер настроен не разрешать запросы DELETE или некоторые другие HTTP1.1 + глаголы. В любом случае сами HTML-формы не допускают действий PUT, PATCH или DELETE. Хотя они должны работать на JavaScript, стоит дать метод spoofing метода попробовать в вашем запросе AJAX. Это обойдет любую конфигурацию вашего сервера, которая могла бы блокировать такой запрос, а также работать независимо от того, используете ли вы форму или AJAX.

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

Ответ 2

1 - Возможно, DELETE отключен хостинг-провайдером. Спросите у хостинг-провайдера, включен ли DELETE. Если у вас есть доступ к apache, проверьте, включен ли модуль WebDAV, а если нет, включите его.

2 - Возможно, это проблема CORS. Включен ли CORS в API. Отправьте заголовки CORS с запросом API. barryvdh/laravel-cors - отличный пакет для API Laravel для этой цели.

3 - Попробуйте изменить тип на POST и добавьте _method = "DELETE" в запрос. как это

$.ajax({ 
         url: 'http://eindeks.000webhostapp.com/przedmioties/' + id, 
         type: 'POST',
         data: {_method: 'delete'},

Ответ 3

Поддерживает ли ваш хост запросы DELETE? Если нет, то вы могли бы ̶ реорганизовать контроллер и добавить действие Parameter, ̶ например, ̶ ̶ и ̶P̶O̶S̶T̶ ̶ Запрос на ваш ̶s̶e̶r̶v̶e̶r̶.̶ ̶ ̶ ̶

̶ ̶ функции сохранения ($ ̶ запрос запрос, ̶ ̶ ̶ $= ACTION ̶ ̶'̶s̶t̶o̶r̶e̶'̶) ̶ ̶ ̶ ̶ {̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ıf ($ ̶ ̶ = ACTION = ̶ ̶ = ̶ ̶'̶s̶t̶o̶r̶e̶'̶) ̶ ̶ ̶ ̶ {̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶/̶/̶ STORE ̶ новую запись ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶} ИНАЧЕ ЕСЛИ ̶ ($ ̶ ̶ = ACTION ̶ = ̶ = ̶ ̶'̶d̶e̶l̶e̶t̶e̶'̶) ̶ ̶ {̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ } ̶

Изменить: метод spoofing

Ответ 4

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

<?php
header('Content-Type: application/json');
echo json_encode([
    'method' => $_SERVER['REQUEST_METHOD'],
    'uri' => $_SERVER['REQUEST_URI'],
    'body' => file_get_contents('php://input'),
    'headers' => getallheaders(),
], JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);

Сохраните код как index.php и сделайте запрос к нему. Например, с curl:

curl -XDELETE http://example.com/index.php

Если ваш сервер работает правильно, вы должны получить ответ, подобный этому:

{
    "method": "DELETE",
    "uri": "/index.php",
    "body": "",
    "headers": {
        "Host": "example.com",
        "User-Agent": "curl/7.53.1",
        "Accept": "*/*"
    }
}

Если нет, то вы знаете, где проблема.

Ответ 5

Попробуйте этот код вместо текущего вашего на doDelete

 function doDelete(id) {
        if (confirm('Naprawdę chcesz usunąć ten wpis?')) {
           $.ajax({ 
             url: 'http://eindeks.000webhostapp.com/przedmioties/' + id, 
             type: 'POST',
             data: {_method: 'delete'},
           }).success(function() {
               theGrid.ajax.reload();
           });
        }
        return false;
 }

Это приведет к тому, что маршрутизатор laravel перейдет к действию удаления без необходимости поддержки на сервере глагола DELETE.