Удалить 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.