2017-02-20 2 views
0

Ich habe eine Menge Antworten darauf gesehen, aber aus irgendeinem Grund hat keiner von ihnen für mich gearbeitet. Ich habe ein Formular auf einer Website, das Daten an eine PHP-Datei senden muss (die dann einen PHPMailer sendet).HTACCESS und AJAX POST

Ich möchte die Website WWW erzwungen haben und die .php Erweiterungen von der URL entfernt haben. Ich habe bereits einige Änderungen an meiner .htaccess-Datei vorgenommen, während ich dieses Problem behebt.

Ich habe auch festgestellt, dass, wenn ich auf eine Seite auf meiner Website, z. http://example.com.au/contact, dann wird WWW nicht zum Start der URL gezwungen. Aber wenn ich auf http://example.com.au (Index) gehe, dann wird es zu http://www.example.com.au wechseln. Wie kann ich die .htaccess ändern, so dass ich alle Unterseiten erzwingen kann, um WWW zu erzwingen und POST-Werte nicht zu entfernen?

Mein aktuell .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] 

Ich hatte ursprünglich einen R=301-Tag mit den [L] der zweiten RewriteRule, aber anscheinend war eine Ursache für POST-Werte zu verlieren, so dass ich entfernt, dass. Ich habe auch sowohl mit als auch ohne

RewriteCond %{REQUEST_METHOD} !POST vor beiden, einer, und keiner Regeln versucht.

Hier ist eine vereinfachte Version von meiner Form (ohne Bootklassen usw.):

<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> 

ich die Form Aktion versucht haben, sowohl mit als auch ohne die Endung .php, und sowohl mit als auch ohne die volle URL, alle zurückkehrenden leeren Arrays für var_dump($_POST).

Alle Eingaben im Formular haben sowohl name Tags als auch id Tags.

jQuery (w/validate) Drehbuch:

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

     }); 
    } 
}); 

Der Validator funktioniert; Das Formular wird nicht mit leeren Eingaben übergeben.

Zum Zweck der Fehlersuche habe ich contact_send.php dazu geändert:

<?php 
    var_dump($_POST); 
?> 

Ich hoffe wirklich, dass jemand kann mir helfen, ich bin meinen Verstand mit diesem Problem zu verlieren!

Danke!

Antwort

2

Solange Sie nur R|redirect umschreiben, ändert sich die angezeigte URL im Browser nicht. Ein Umleitungsstatus von 301 oder 302 (Standard) wird jedoch eine Änderung in der Anforderungsmethode zu GET führen.

Wenn Sie die Methode die gleiche behalten wollen, müssen Sie Statuscodes 307

307 Temporary Redirect (seit HTTP/1.1)
In diesem Fall verwenden, sollte die Anforderung mit einem anderen wiederholt werden URI; zukünftige Anforderungen sollten jedoch weiterhin den ursprünglichen URI verwenden.Im Gegensatz zu der historischen Implementierung von 302 wurde die Anforderungsmethode nicht geändert, wenn die ursprüngliche Anforderung erneut ausgegeben wurde. Zum Beispiel sollte eine POST-Anfrage mit einer anderen POST-Anfrage wiederholt werden.

und 308

308 Permanent Redirect (RFC 7538)
Der Antrag und alle zukünftigen Anforderungen sollten unter Verwendung eines anderen URI wiederholt werden. 307 und 308 parallelisieren das Verhalten von 302 und 301, erlauben jedoch keine Änderung der HTTP-Methode. So kann beispielsweise das Senden eines Formulars an eine permanent umgeleitete Ressource problemlos fortgesetzt werden.


Also statt

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

sollten Sie

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

verwenden Sie die POST-Methode zu halten.


Ich habe nicht an der Javascript Teil zuerst, es näher zeigt die Prüfung

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

Der Code zuerst die Form entfernt, und dann versucht, die Eingangswerte mit serialize() zu holen. Da das Formular nicht mehr vorhanden ist, können keine $_POST Daten übertragen werden.

Vielleicht zuerst die Formulardaten holen, hilft hier, z.B.

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

Sie sind mein Retter. Ich kann dir nicht genug danken !! Sie hatten absolut Recht damit, die Daten vor dem Entfernen des Formulars zu serialisieren. Ich danke dir sehr! – jacobian