【发布时间】:2013-03-19 07:32:13
【问题描述】:
我有一个使用 CodeIgniter 构建的应用程序,当某些事件发生时,第三方服务(电子邮件服务提供商)正在发出包含 POST 数据的 http 请求。问题是,我无法完全修改此第 3 方服务发出请求的 url,具体来说,它向我指定的域和目录中名为 w_4.php 的文件发出请求。
我不想将这个单独的文件放在 CodeIgnitier 堆栈之外,而是使用 .htaccess 将对该文件发出的所有请求重写到我的 codeigniter 应用程序中的控制器,即api/my_controller/my_method。但是我需要请求中的 POST 数据完好无损,所以我认为无法使用重定向。
我在我的 .htaccess 中尝试过这样的事情:
RewriteCond $1 (w_4\.php)
RewriteRule ^(.*)$ index.php/api/my_controller/my_method
虽然请求确实被路由到 codeigniter,但即使该控制器/路由确实存在,我也只会得到 404。
【问题讨论】:
-
带有
[R,L]标志的规则工作正常,它重定向到mydomain.com/index.php/api/my_controller/my_method 并在my_controller控制器中调用my_method方法。似乎即使 URL 正在被重写,codeigniter 仍然只是查看“w_4.php”的实际传递 URI 以找出路由并因此报告 404? -
我有点困惑,所以重定向工作,
my_method做它的事情,但你得到一个 404? -
没有重定向标志
[R](只是在内部重写请求)我得到一个404,但是重定向my_method被成功调用。但是,在这种情况下,我认为将重写规则作为重定向不是要走的路,因为原始请求包含我需要能够在 my_method 中访问的 POST 数据。 -
@Bill 如果它是一个查询,它会自动附加到替换 URL 中,所以这应该不是问题。正如我在之前的评论中所说,添加 [R,L] 标志以查看替换 URL 以确保也传递 POST 数据。
-
@faa @Marc - 我搞定了。为了保留 POST 数据,只需要
[P]而不是[R,L]。P标志表示请求应该完整地传递给代理模块,因为我发现 [here](stackoverflow.com/questions/358263/…),而仅使用R重定向标志会导致 POST 数据丢失(运行验证这一点的测试)。
标签: .htaccess codeigniter mod-rewrite rewrite