如何在.htaccess重定向后通过ajax请求保留POST数据?

时间:2012-12-14 21:38:20

标签: php apache .htaccess mod-rewrite redirect

.htacesss

RewriteCond %{REQUEST_URI} ^/api/(.+)$
RewriteRule ^api/(.+)$ /index.php?api=%1 [QSA,L]

示例ajax url请求: 'http://hostname.com/api/ext/list.php?query=de'

我希望能够将此格式的网址重定向到以下内容 index.php?api = {requested_filename}& param1 = value1& param2 = value2 ...

因为整个站点是通过index.php中的bootstrap进程处理的,它有一个路由部分加载配置,模板等......

例如,当我尝试使用jquery代码时,POST数据在重定向后会丢失。

$.ajax({
            url: '/api/contact.php',
            type: 'POST',
            data: { 
                email: $("#contactEmail").val(),
                name: $("#contactName").val(),
                message: $("#contactMessage").val()
                                // etc ...
            }
});

我已经读过你无法在http重定向上保留数据。但是所有框架如何避免这种情况呢?我编写了许多代码,并且每个代码都通过index.php引导,并且.htaccess文件中有重写规则用于启用漂亮的URL。因此,在Yii中,我会使用一些POST数据调用URL“api / uploads / latests.json”,并且后端的控制器将接收该数据。我在这里缺少什么?

注意:我已经测试了 [P] mod_rewrite参数,我认为此服务器没有启用mod_proxy。

3 个答案:

答案 0 :(得分:4)

重写和重定向之间存在差异。

Rewrite是一个apache(和其他服务器)模块,它将遵循一组cond /规则将请求的URL映射到服务器上的文件(例如:引导程序将所有URL重写为单个文件,通常是index.php。 mvc可能会将/ model / controller / view uri映射到一个调用相应mvc文件的index.php。)

重定向实际上会更改您所在的页面。有人请求页面A.php,该页面上写着“你要找的是B.php”,所以你的浏览器会转到B.php。

重写将保留post参数,因为url不会更改。重写只会更改所请求的脚本,但是对于浏览器,看起来页面仍然存在于请求的URL中。

重定向不会保留帖子参数,因为服务器会将您完全重定向到另一个页面。

您尝试做的是重写,而不是重定向。获取帖子参数应该没有问题。

要解决此问题,您如何在index.php中检查没有帖子参数?你确定你想要的控制器被调用吗?

答案 1 :(得分:3)

重定向时丢失所有POST数据。没有办法通过htaccess重写/重定向规则来保留它。

客户端(我知道的所有主要浏览器)收到的重定向(全部301,302,303)被视为发出GET请求的新URL。浏览器不会自动将旧帖子参数添加到此URL - 即使重定向源是POST请求。

我发现的唯一方法是在代码内部重写并将POST参数转换为GET参数并将它们粘贴在新URL的末尾。在php中,然后发出标题位置更改(或者您选择的库使用的任何重定向调用):

header("Location: http://www.example.com/?my_old_post_args=123"); 
exit;

答案 2 :(得分:1)

对于任何一个有这个问题,我有sam问题,我使用 像这样的事情

RewriteRule ^services/MainService/(.*)$ http://193.9.162.91/mobile-feed/mobile.list.news.images.php?original_request=$1 [R=301,L]

这不适用于ajax post我必须将RewriteRule改为

RewriteRule ^services/MainService/(.*)$ http://193.9.162.91/mobile-feed/mobile.list.news.images.php?original_request=$1 [QSA,L]
这项工作 在php文件中我有

$inputJSON = file_get_contents('php://input');
$input= json_decode( $inputJSON, TRUE ); //convert JSON into array
print_r($input);