2017-02-20 141 views
0

我已經看到了很多這樣的答案,但由於某種原因,他們都沒有爲我工作。我有一個網站上的表單,需要將數據發佈到一個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標籤與第二RewriteRule[L],但顯然這是失去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的(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將不會更改。但是,重定向狀態301302(默認值)將導致請求方法更改爲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, 
    // ... 
}); 
+0

你是我的救星。我不能夠感謝你!在刪除表單之前,您完全正確地對數據進行序列化。非常感謝! – jacobian