5

.htacess

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

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

我希望能够以这种格式将 url 重定向到以下 index.php?api={requested_filename}¶m1=value1¶m2=value2 ...

因为整个站点是通过 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。

4

3 回答 3

5

重写和重定向之间是有区别的。

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

重定向实际上会更改您所在的页面。有人请求页面 A.php,该页面显示“您要查找的内容在 B.php 上”,因此您的浏览器转到 B.php。

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

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

您似乎正在尝试做的是重写,而不是重定向。获取 post 参数应该没有问题。

要解决此问题,您如何在 index.php 中检查没有 post 参数?您确定正在调用您期望的控制器吗?

于 2012-12-14T21:52:56.833 回答
3

所有 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;
于 2012-12-14T21:41:57.060 回答
1

对于任何人有这个问题我有山姆问题,我使用这样的东西

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

这不适用于 ajax 帖子我必须将 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);
于 2016-03-28T10:45:00.437 回答