2017-02-20 140 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