【问题标题】:HTACCESS and AJAX POSTHTACCESS 和 AJAX POST
【发布时间】:2017-02-21 02:38:40
【问题描述】:

我已经看到了很多关于这个问题的答案,但由于某种原因,没有一个对我有用。我在网站上有一个表单,需要将数据发布到 php 文件(然后将发送一个 PHPMailer)。

我希望网站强制使用 WWW 并从 URL 中删除 .php 扩展名。在调试此问题时,我已经对我的 .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 标记和第二个 [L]RewriteRule,但显然这是丢失 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(带验证)脚本:

$('#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);
?>

我真的希望有人可以帮助我,我正在为这个问题失去理智!

谢谢!

【问题讨论】:

    标签: php jquery ajax .htaccess mod-rewrite


    【解决方案1】:

    只要你只重写而不是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,
        // ...
    });
    

    【讨论】:

    • 你是我的救星。我不能感谢你!在删除表单之前序列化数据是绝对正确的。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 2011-11-01
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    相关资源
    最近更新 更多