HTACCESS и AJAX POST

Я видел много ответов на это, но по какой-то причине ни один из них не помог мне. У меня есть форма на веб-сайте, который должен POST данные в файл php (который затем отправит PHPMailer).

Я хочу, чтобы на веб-сайте был принудительно установлен WWW, а расширения .php были удалены из URL. Я уже внес некоторые изменения в мой файл .htaccess во время отладки этой проблемы.

Я также заметил, что когда я захожу на страницу на моем сайте, например, http://example.com.au/contactтогда WWW не будет принудительно переведен на начало URL. Но если я пойду к http://example.com.au (индекс), то он изменится на http://www.example.com.au, Как я могу изменить .htaccess, чтобы я мог заставить все подстраницы вызывать WWW, не удаляя значения POST?

Мой текущий .htaccess:

RewriteEngine on

# Remove .php
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php [QSA,L]

# Force WWW
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [L]

У меня изначально был R=301 пометить с [L] второго RewriteRule, но, видимо, это было причиной потери значений POST, поэтому я удалил это. Я также пробовал как с, так и без

RewriteCond %{REQUEST_METHOD} !POST
перед тем как один из, и ни один из правил.

Вот упрощенная версия моей формы (без классов начальной загрузки и т. Д.):

<div class="form_container">
<form name="contactForm" id="contact_form" action="http://www.*MyURL*.com.au/scripts/contact_send" method="POST">
<div class="row">
<div>
<label for="inputFirstName">First Name: </label>
<input name="firstname" id="inputFirstName" type="text" required>
</div>
<div>
<label for="inputSurname">Surname: </label>
<input name="surname" id="inputSurname" type="text" required>
</div>
</div>
<div class="row">
<div>
<label for="inputEmail">Email: </label>
<input name="email" id="inputEmail" type="email" required>
</div>
<div>
<label for="inputPhone">Phone (optional): </label>
<input name="phone" id="inputPhone" type="tel">
</div>
</div>
<div class="row">
<div>
<input type="submit" name="submit" value="Send">
</div>
</div>
</form>
</div>

Я пробовал действие формы, как с расширением .php, так и без него, а также с полным URL-адресом и без него, все возвращали пустые массивы для var_dump($_POST),

Все входные данные в форме имеют оба name теги и id теги.

Сценарий jQuery (с подтверждением):

$('#contact_form').validate({

...

submitHandler: function(form){

$('.form_container').html('<div class="loader"></div>');
$('html, body').animate({scrollTop: $('#header').height()}, 500);

$.ajax({

url: form.action,
type: form.method,
data: $('#contact_form').serialize(),
success: function(data) {
$('.form_container').html(data);
}

});
}
});

Валидатор работает; форма не будет отправлена ​​с пустыми данными.

В целях отладки я изменил contact_send.php к этому:

<?php
var_dump($_POST);
?>

Я действительно надеюсь, что кто-то может мне помочь, я схожу с ума от этой проблемы!

Спасибо!

0

Решение

Пока вы только переписать вместо R|redirect, URL, отображаемый в браузере, не изменится. Тем не менее, статус перенаправления 301 или же 302 (по умолчанию) приведет к изменению метода запроса на GET,

Если вы хотите сохранить метод таким же, вы должны использовать коды состояния 307

307 Временное перенаправление (начиная с HTTP / 1.1)
В этом случае запрос должен быть повторен с другим URI; тем не менее, будущие запросы все равно должны использовать исходный URI. В отличие от того, как 302 был исторически реализован, метод запроса не может быть изменен при повторном выдаче исходного запроса. Например, запрос POST должен повторяться с использованием другого запроса POST.

а также 308

308 постоянный редирект (RFC 7538)
Запрос и все последующие запросы должны повторяться с использованием другого URI. 307 и 308 соответствуют поведениям 302 и 301, но не позволяют методу HTTP измениться. Так, например, отправка формы на перенаправленный ресурс может продолжаться без проблем.


Так что вместо

RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [L]

ты должен использовать

RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=307,L]

сохранить метод POST.


Сначала я не смотрел на часть Javascript, рассматривая ее ближе

$('.form_container').html('<div class="loader"></div>');
// ...
$.ajax({
// ...
data: $('#contact_form').serialize(),
// ...
});

Код сначала удаляет форму, а затем пытается извлечь входные значения с serialize(), Поскольку формы больше нет, нет $_POST данные могут быть переданы.

Может быть, сначала нужно получить данные формы, например, здесь.

var form_data = $('#contact_form').serialize();
$('.form_container').html('<div class="loader"></div>');
// ...
$.ajax({
// ...
data: form_data,
// ...
});
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector