HTACCESS和AJAX POST

时间:2017-02-20 10:58:56

标签: php jquery ajax .htaccess mod-rewrite

我已经看到了很多答案,但由于某种原因,他们都没有为我工作。我在网站上有一个表单,需要将数据POST到一个php文件(然后发送一个PHPMailer)。

我希望网站强制使用WWW,并从URL中删除.php扩展名。在调试此问题时,我已经对.htaccess文件进行了一些更改。

我还注意到,当我访问我网站上的某个页面时,例如http://example.com.au/contact,然后WWW不会被迫进入网址的开头。但是,如果我转到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]的{​​{1}}一样,但显然这是丢失POST值的原因,所以我将其删除了。我也尝试了有无和

RewriteRule 在两者之前,其中之一,都没有规则。

这是我的表格的简化版本(没有引导类等):

RewriteCond %{REQUEST_METHOD} !POST

我尝试过带有和不带.php扩展名的表单操作,无论是否有完整的URL,都返回<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> 的空数组。

表单中的所有输入都包含var_dump($_POST)个标记和name标记。

jQuery(w / validate)脚本:

id

验证器确实有效;表格不会以空的投入提交。

出于调试目的,我已将$('#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

我真的希望有人可以帮助我,我会因为这个问题而失去智慧!

谢谢!

1 个答案:

答案 0 :(得分:2)

只要您只重写而不是R|redirect,浏览器中显示的网址就不会更改。但是,重定向状态为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,
    // ...
});