Ошибка 405 с конфигурацией Ajax POST / Nginx

Я пытаюсь отправить электронное письмо с помощью формы Ajax и быстрой рассылки. Он работает на местном уровне, но не на производстве.

Когда contact_me.php принимает параметры не из формы, а явно написано, электронное письмо отправляется даже с сервера, поэтому я думаю, что Swiftmailer работает.

contact_me.js

// Contact Form Scripts

$(function() {

    $("#contactForm input,#contactForm textarea").jqBootstrapValidation({
        preventSubmit: true,
        submitError: function($form, event, errors) {
            // additional error messages or events
        },
        submitSuccess: function($form, event) {
            event.preventDefault(); // prevent default submit behaviour
            // get values from FORM
            var name = $("input#name").val();
            var email = $("input#email").val();
            var phone = $("input#phone").val();
            var message = $("textarea#message").val();
            var firstName = name; // For Success/Failure Message
            // Check for white space in name for Success/Fail message
            if (firstName.indexOf(' ') >= 0) {
                firstName = name.split(' ').slice(0, -1).join(' ');
            }
            $.ajax({
                url: "././mail/contact_me.php",
                type: "POST",
                data: {
                    name: name,
                    phone: phone,
                    email: email,
                    message: message
                },
                dataType: "text",
                cache: false,
                success: function() {
                    // Success message       
                },
                error: function() {
                    // Fail message                    
                },
            });
        },
        filter: function() {
            return $(this).is(":visible");
        },
    });

    $("a[data-toggle=\"tab\"]").click(function(e) {
        e.preventDefault();
        $(this).tab("show");
    });
});


/*When clicking on Full hide fail/success boxes */
$('#name').focus(function() {
    $('#success').html('');
});

contact_me.php

<?php
// Autoload for swiftmailer
require_once '../vendor/autoload.php';

// Check for empty fields
if(empty($_POST['name'])      ||
   empty($_POST['email'])     ||
   empty($_POST['phone'])     ||
   empty($_POST['message'])   ||
   !filter_var($_POST['email'],FILTER_VALIDATE_EMAIL))
   {
   echo "No arguments Provided!";
   return false;
   }


$name = strip_tags(htmlspecialchars($_POST['name']));
$email_address = strip_tags(htmlspecialchars($_POST['email']));
$phone = strip_tags(htmlspecialchars($_POST['phone']));
$message = strip_tags(htmlspecialchars($_POST['message']));

// Create the email and send the message
$email_subject = "TrustPair nouveau contact :  $name";
$email_body = "New form.\n\n"."Here are the details:\n\nName: $name\n\nEmail: $email_address\n\nPhone: $phone\n\nMessage:\n$message";

// Add here swiftmailer code, need to return true
// Create the Transport
$transport = (new Swift_SmtpTransport('mail.gandi.net', 465, "ssl"))
  ->setUsername('[email protected]')
  ->setPassword('password')
;

// Create the Mailer using your created Transport
$mailer = new Swift_Mailer($transport);

// Create the message
$message = (new Swift_Message())
    // Give the message a subject
    ->setSubject($email_subject)
    // Set the From address with an associative array
    ->setFrom(['[email protected]' => 'Domain no reply'])
    // Set the To addresses
    ->setTo(['[email protected]', '[email protected]'])
    // Give it a body
    ->setBody($email_body)
    ;

// Send the message
$result = $mailer->send($message);
echo $result;
// result is equal to the nbr of message recipients

if ($result == 0) {
    return false;
} else {
    return true;
}


?>

person user3707264    schedule 18.06.2017    source источник
comment
есть ли ошибки?   -  person hassan    schedule 18.06.2017
comment
jquery.min.js: 4 POST example.com/mail/contact_me_test.php 405 (Не Разрешено) send @ jquery.min.js: 4 ajax @ jquery.min.js: 4 submitSuccess @ contact_me.js: 22 (анонимно) @ jqBootstrapValidation.js: 76 dispatch @ jquery.min.js: 3 r.handle @ jquery .min.js: 3   -  person user3707264    schedule 18.06.2017
comment
Ваш код url: "././mail/contact_me.php", а в сообщении об ошибке написано: /mail/contact_me_test.php. Это даже не пытаться выложить в один и тот же файл? (и вы также должны удалить ././mail/... перед URL-адресом и использовать относительное значение от корня: /mail/...)   -  person Magnus Eriksson    schedule 18.06.2017
comment
Я заменил contact_me.php новым файлом contact_me_test.php, в котором я использую не ввод из формы, а значения, которые есть в коде. Когда я запускаю php contact_me_test.php, электронное письмо отправляется. Поменял путь на относительный, у меня всегда одна и та же ошибка 405.   -  person user3707264    schedule 18.06.2017
comment
Я не знаю, помогает ли это, но код работает, когда я использую виртуальный хост wamp локально. Однако, если я использую browserSync (localhost), у меня появляется ошибка 404 POST localhost: 3000 / mail / contact_me.php 404 (не найдено), я не запускаю browserSync в продукте, поэтому я не уверен, как это может помочь.   -  person user3707264    schedule 18.06.2017


Ответы (1)


Сервер Nginx не разрешает POST-запрос со статической страницей (например, * .html).

Есть хаки для обработки эта проблема. В моем случае это исправляет ошибку 405, но письма не отправляются.

Решение заключалось в том, чтобы изменить index.html на index.php, обязательно адаптируйте конфигурацию Nginx, чтобы отразить эти изменения.

person user3707264    schedule 18.06.2017