Я создал HTML-веб-форму, которая собирает информацию о подписчике через AJAX, обрабатывает через php-скрипт и отправляет его в mailchimp.
Форма отправки работала нормально, пока SSL не был добавлен в домен. Я продолжаю получать 405 Not Allowed, когда я пытаюсь отправить форму. И я не мог понять, что пошло не так. У меня есть ощущение, что это связано с конфигурацией сервера Nginx, но я не эксперт в этой области и не знаю, где искать.
После некоторых исследований я наткнулся на несколько постов, в которых обсуждается, как «Nginx не позволяет POST статическому контенту», но я не уверен, применимо ли это к моему случаю, потому что эта проблема возникла только после добавления ssl (я использую Nginx + PHP на Alicloud). Ниже приведены мои коды:
<section id="mailchimp">
<div class="container">
<form id="form" method="POST" action="action.php">
<p class="sub-lead">* indicates required.</p>
<input type="email" name="EMAIL" id="form_email" placeholder="Email Address *" required="required">
<input type="text" name="FNAME" id="form_fname" placeholder="First Name *" required="required">
<input type="text" name="LNAME" id="form_lname" placeholder="Last Name *" required="required">
<input type="text" name="PHONE" id="form_phone" placeholder="Phone Number *" required="required">
<select name="ROOM" id="room">
<option value="" disabled selected>I am interested in...</option>
<option value="1 Bedroom">1 Bedroom</option>
<option value="2 Bedroom">2 Bedroom</option>
<option value="3 Bedroom">3 Bedroom</option>
</select>
<input type="checkbox" id="opt-in" name="opt-in" value="opt-in" required="required">Yes, I want to receive current & future projects info from the development team & its affiliates.<br>
<input type="submit" value="submit" id="submit">
<div id="signup-result"></div>
</form>
</div>
</section>
PHP
<?php
//fill in these values for with your own information
$api_key = 'xxxxxxxx-us16';
$datacenter = 'us16';
$list_id = 'xxxxxxxxx;
$email = $_POST['email'];
$fname = $_POST['first_name'];
$lname = $_POST['last_name'];
$phone = $_POST['phone'];
$room = $_POST['room'];
$country = $_POST['country'];
$status = 'subscribed';
if(!empty($_POST['status'])){
$status = $_POST['status'];
}
$url = 'https://'.$datacenter.'.api.mailchimp.com/3.0/lists/'.$list_id.'/members/';
$username = 'apikey';
$password = $api_key;
$data = array("email_address" => $email,
"status" => $status,
"merge_fields" => array(
"FNAME" => $fname,
"LNAME" => $lname,
"PHONE" => $phone,
"ROOM" => $room,
)
);
$data_string = json_encode($data);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$api_key");
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($data_string))
);
$result=curl_exec ($ch);
curl_close ($ch);
echo $result;
?>
вот аякс
// Mailchimp Form
$('#form').submit(function(e){
e.preventDefault();
//grab attributes and values out of the Form
var data = {
email: $('#form_email').val(),
first_name: $('#form_fname').val(),
last_name: $('#form_lname').val(),
phone: $('#form_phone').val(),
room: $('#room').val(),
};
var endpoint = $(this).attr('action');
//make the ajax request
$.ajax({
method: 'POST',
dataType: "json",
url: endpoint,
data: data
}).done(function(data){
if(data.id){
//successful adds will have an id attribute on the object
window.location='thankyou.html'
} else if (data.title == 'Member Exists') {
//MC wil send back an error object with "Member Exists" as the title
alert('It looks like you have already signed up with this email address. If you have any questions, please feel free to contact us by email or phone.');
} else {
//something went wrong with the API call
alert('Oops, we could not reach server at the moment, please try again later.');
}
}).fail(function(){
//the AJAX function returned a non-200, probably a server problem
alert('oh no, there has been a problem');
});
});
Задача ещё не решена.
Других решений пока нет …