2017-02-20 5 views
0

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

Я хочу, чтобы на веб-сайте был установлен 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 (ж/Validate) Сценарий:

$('#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); 
?> 

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

Спасибо!

ответ

2

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

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

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

и 308

308 Permanent Redirect (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, 
    // ... 
}); 
+0

Вы - мой спаситель. Я не могу вас поблагодарить! Вы абсолютно правильно относились к сериализации данных перед удалением формы. Спасибо огромное! – jacobian