Ajax XHR не удалось загрузить с внутренней ошибкой сервера 500

#javascript #php #jquery #ajax #synology

#javascript #php #jquery #ajax #synology

Вопрос:

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

Я пытаюсь реализовать ajax-вызов php-скрипта на Synology DS415play под управлением DSM 6.2.3-25426 Update 2. Я следую приведенным здесь инструкциям: https://www.digitalocean.com/community/tutorials/submitting-ajax-forms-with-jquery , используя три файла: index.html , form.js и process.php

Однако вызов ajax в form.js сбой со следующими консольными сообщениями:

    VM322:1 POST http://192.168.7.20/~user/process.php 500 (Internal Server Error)

   VM322:1 XHR failed loading: POST "http://192.168.7.20/~user/process.php"
  

Сетевой журнал показывает следующее:

 Request URL: http://192.168.7.20/~user/process.php
Request Method: POST
Status Code: 500 Internal Server Error
Remote Address: 192.168.7.20:80
Referrer Policy: strict-origin-when-cross-origin

**Response Headers**
    Accept-Ranges: bytes
    Connection: keep-alive
    Content-Encoding: gzip
    Content-Length: 1696
    Content-Type: text/html
    Date: Wed, 04 Nov 2020 23:44:21 GMT
    ETag: "cfa-5ae3c755f3d80"
    Keep-Alive: timeout=20
    Last-Modified: Tue, 01 Sep 2020 08:39:34 GMT
    Server: nginx
    Vary: Accept-Encoding

**Request Headers**
    Accept: application/json, text/javascript, */*; q=0.01
    Accept-Encoding: gzip, deflate
    Accept-Language: en-GB,en-US;q=0.9,en;q=0.8
    Cache-Control: no-cache
    Connection: keep-alive
    Content-Length: 5
    Content-Type: application/x-www-form-urlencoded; charset=UTF-8
    Cookie: stay_login=0; id=c6OiV4GQDLu86y7E3yfyJTNHdambIB1thxRyeiDnDjgBrXSdBh25Lw2pbbJDQo1WGppdrfrFrm208MiUZ0HfCw; smid=WFXk4Mx31ghEHii0PVWGAsbNsHnd3uBl-toxQM3_VofCuY-KKq5EdnvNq6V7PojMcNxbWVUwQ78s7DKHui-2rA
    DNT: 1
    Host: 192.168.7.20
    Origin: http://192.168.7.20
    Pragma: no-cache
    Referer: http://192.168.7.20/~user/
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36
    X-Requested-With: XMLHttpRequest
    Form Dataview sourceview URL encoded
  

Здесь находятся три исходных файла (все они хранятся в папке user / www):

index.html

 <!doctype html>    
<html>    
<head>    
    <title>Look I'm AJAXing!</title>    
    <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css"> <!-- load bootstrap via CDN -->    
    <script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script> <!-- load jquery via CDN -->    
    <script src="form.js"></script> <!-- load our javascript file -->    
</head>

<body>    
<div class="col-sm-6 col-sm-offset-3">    
    <h1>Processing an AJAX Form</h1>    
    <!-- OUR FORM -->    
    <form action="process.php" method="POST">    
        <!-- NAME -->    
        <div id="name-group" class="form-group">    
            <label for="name">Name</label>    
            <input type="text" class="form-control" name="name" placeholder="Henry Pym">    
            <!-- errors will go here -->    
        </div>    
        <button type="submit" class="btn btn-success">Submit <span class="fa fa-arrow-right"></span></button>    
    </form>    
</div>    
</body>    
</html>
  

form.js

 $(document).ready(function() {    
    // process the form    
    $('form').submit(function(event) {    
        // get the form data    
        var formData = {    
            'name'              : $('input[name=name]').val()    
        };    
        // process the form    
        $.ajax({    
            type        : 'POST', // define the type of HTTP verb we want to use (POST for our form)    
            url         : 'process.php', // the url where we want to POST    
            data        : formData, // our data object    
            dataType    : 'json', // what type of data do we expect back from the server    
            encode      : true    
        })    
            // using the done promise callback    
            .done(function(data) {    
                // here we will handle errors and validation messages    
                if ( ! data.success) {    
                  // handle errors for name ---------------    
                  if (data.errors.name) {    
                    $('#name-group').addClass('has-error'); // add the error class to show red input    
                    $('#name-group').append('<div class="help-block">'   data.errors.name   '</div>'); // add the actual error message under our input    
                  }    
                   } else {    
                   // ALL GOOD! just show the success message!    
                      $('form').html('<div class="alert alert-success">'   data.message   '</div>');    
                   }    
           }) 
          // using the fail promise callback    
          .fail(function(data) {    
             //Server failed to respond - Show an error message    
               $('form').html('<div class="alert alert-danger">Could not reach server, please try again later.</div>');    
    });    
        // stop the form from submitting the normal way and refreshing the page    
        event.preventDefault();    
    });   

});
  

process.php

 <?php    
$errors         = array();      // array to hold validation errors    
$data           = array();      // array to pass back data    
// validate the variable    
if (empty($_POST['name']))    
    $errors['name'] = 'Name is required.';    
// if there are any errors in our errors array, return a success boolean of false    
if ( ! empty($errors)) {    
    // if there are items in our errors array, return those errors    
    $data['success'] = false;    
    $data['errors']  = $errors;    
} else {    
    // show a message of success and provide a true success variable    
    $data['success'] = true;    
    $data['message'] = 'Success!';    
}    
// return all our data to an AJAX call    
echo json_encode($data);
  

Есть идеи, почему я получаю внутреннюю ошибку сервера?

С уважением, Андрей

Комментарии:

1. Это может быть пространство в ! empty($errors)

2. Часто ошибка 500 является синтаксической ошибкой в вашем PHP-коде, вы должны проверить журналы ошибок сервера, у вас может быть причина.. @KooiInc пространство там не должно иметь значения (даже если оно немного уродливое)

3. Было бы полезно, если бы вы могли показать параметры вашего запроса из сетевого журнала, также попробуйте удалить все из файла PHP и вернуть что-то простое, это позволит убедиться, что проблема где-то в вашем коде, тогда мы сможем отлаживать PHP построчно

4. У вас консоль показывает ошибку? Это может быть по причинам политики CORS

5. Спасибо за все предложения, но по-прежнему безуспешно. Сейчас я работаю с минимальным файлом PHP, который не принимает параметров и просто возвращает текстовую строку. Мне удалось найти журналы apache (не журналы Synology PHP) и найти «[путь] не в настроенном docroot». Но установка doc_root в настройках PHP веб-станции (core) не имеет никакого эффекта. Есть предложения?