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

mm9b1k5b  于 2023-03-09  发布在  其他
关注(0)|答案(3)|浏览(182)

. h访问次数

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

示例 AJAX 请求:“主机名称”
我希望能够重定向此格式的网址到以下索引。php?API={requested_filename}&param1=value1&param2= value 2...
因为整个站点是通过index.php中的 Bootstrap 处理的,index.php中有一个加载配置、模板等的路由部分。
例如,当我尝试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。

d6kp6zgx

d6kp6zgx1#

重写和重定向是有区别的。
Rewrite是一个Apache(和其他服务器)模块,它将遵循一组条件/规则将请求的URLMap到服务器上的文件(例如: Bootstrap 将所有URL重写到单个文件(通常为index.php)。MVC可以将/model/controller/viewURIMap到调用适当MVC文件的index.php)。
重定向实际上改变了你所访问的页面,有人请求访问A.php页面,而该页面显示“what you are looking is on B.php”,于是你的浏览器转到B.php。
重写将保留post参数,因为url没有改变。重写将只改变所请求的脚本,但对于浏览器来说,页面看起来仍然存在于所请求的url中。
重定向不会保留post参数,因为服务器会将您完全重定向到另一个页面。
看起来你正在尝试做的是重写,而不是重定向。你应该没有问题获得后参数。
要解决这个问题,你如何检查index.php中没有post参数?你确定你所期望的控制器被调用了吗?

r1zhe5dt

r1zhe5dt2#

所有POST数据在重定向时丢失。无法通过htaccess重写/重定向规则保留它。
客户端(我知道的所有主流浏览器)接收到的重定向(所有301、302、303)被当作一个新的URL来进行GET请求,浏览器不会自动将旧的post参数附加到这个URL--即使重定向的源是一个POST请求。
我所找到的唯一解决方法是重写内部代码,将POST参数转换为GET参数,并将它们粘贴在新url的末尾。在php中,您可以发出一个头位置更改(或任何您选择的库使用的重定向调用):

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

am46iovg3#

对于任何有这个问题的人,我也有同样的问题,我用这样的东西

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

这将不工作与 AJAX 后,我不得不改变重写规则

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);

相关问题