2017-02-20 5 views
0

私はこれに多くの答えを見ましたが、何らかの理由で私のために働いたことはありません。私はPHPファイルにPOSTデータを必要とするウェブサイト上にフォームを持っています(PHPMailerを送信します)。HTACCESSとAJAX POST

ウェブサイトにWWWを強制し、URLから.php拡張子を削除したいとします。私はすでにこの問題をデバッグしながら、.htaccessファイルにいくつかの変更を加えました。

私はまた、自分のウェブサイトのページに行くときに気付いたことがあります。 http://example.com.au/contactの場合、WWWはURLの先頭に強制されません。しかし、http://example.com.au(インデックス)に行くと、http://www.example.com.auに変わります。どのようにして.htaccessを変更して、POST値を削除しないで、WWWを強制するためにすべてのサブページを取得することができますか?

私の現在の.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] 

私はもともと二RewriteRule[L]R=301タグを持っていたが、どうやらそれは、POST値を失う原因だったので、私はそれを削除しました。私はまた、両方の一つであり、どちらのルールの前に

RewriteCond %{REQUEST_METHOD} !POST とし、

なしの両方試してみました。私は、完全なしの両方でとの.php拡張子なしの両方、フォームアクションを試してみました、としている

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

:ここ

は私のフォームの簡易版です(ブートストラップクラスなどなし) URLはすべて var_dump($_POST)の空の配列を返します。

フォームのすべての入力は、nameタグとidタグの両方を持ちます。

jQueryの(検証/ W)スクリプト:

$('#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に変更されます。

あなたが同じ方法を維持したい場合は、この場合、(HTTP/1.1以降)307

307一時的なリダイレクト
ステータスコードを使用する必要があり、要求は別で繰り返されるべきですURI;ただし、今後のリクエストでも元のURIを使用する必要があります。302が歴史的にどのように実装されたのとは対照的に、元の要求を再発行するときに要求メソッドは変更できません。たとえば、POST要求は、別のPOST要求を使用して繰り返す必要があります。

308

308永久リダイレクト(RFC 7538)
要求と将来のすべての要求が別のURIを使用して繰り返されるべきです。 307と308は302と301の動作と平行ですが、HTTPメソッドを変更することはできません。たとえば、永続的にリダイレクトされたリソースにフォームを送信すると、スムーズに処理が続行されます。あなたはPOSTメソッドを維持するために

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

を使用する必要があります


ので、代わりの

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


私は、コードは最初のフォームを削除し、その後、serialize()で入力値をフェッチしようとすると、それに近いショー

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

を調べ、最初のJavascriptの部分を見ていませんでした。フォームはもう存在しないので、$_POSTのデータを送信することはできません。

は多分最初のフォームデータをフェッチし、例えば、ここに役立ちます

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

あなたは私の救世主です。私は十分にあなたに感謝することはできません!フォームを削除する前にデータをシリアライズすることは絶対に正しいです。どうもありがとうございます! – jacobian