我已经看到了很多答案,但由于某种原因,他们都没有为我工作。我在网站上有一个表单,需要将数据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
我真的希望有人可以帮助我,我会因为这个问题而失去智慧!
谢谢!
答案 0 :(得分:2)
只要您只重写而不是R|redirect
,浏览器中显示的网址就不会更改。但是,重定向状态为301
或302
(默认)会导致请求方法更改为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,
// ...
});