我正在将我们的网站从Codeigniter 3升级到Codeigniter 4。到目前为止,这是一个乏味的过程,但大多数情况下进展顺利。我现在遇到了一个问题,一个控制器无法识别用C编写的应用程序发布的值。这个应用程序已经与CI 3一起工作了很多年,但是......嗯,CI 4。我不知道关于C应用程序的所有细节,但是开发人员向我保证他肯定是使用HTTP_VERB_POST将数据发送到控制器的。----EDIT------下面是C++应用程序中调用相关控制器的代码:
subscriptioninfo = pSession->OpenRequest(CHttpConnection::HTTP_VERB_POST, address, NULL, NULL, NULL, NULL, INTERNET_FLAG_SECURE | INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE);
我已经为控制器创建了一个视图,并且可以使用浏览器成功地从表单发布值。
然而-从应用程序发布1)告诉我请求方法是GET和2)没有值在所有已传递。然而它确实-给我的响应,我会期望如果没有值传递到控制器......
将以下内容添加到我的控制器后:
header('Access-Control-Allow-Origin: *');
echo $this->request->getMethod();
echo "\n POST VARS = ";
print_r($_POST);
echo "\n GET VARS = ";
print_r($_GET);
echo "\n";
我得到如下结果:
get
POST VARS = Array
(
)
GET VARS = Array
(
)
Activation: No
Error: No parameters sent.
最后两行(Activation和Error)是我希望从这个控制器中得到的,如果确实没有发送参数的话。
哦,不,我没有在我的CI 4应用程序中启用CSRF(除了默认的基于Cookie的CSRF保护)。
如有任何想法,将不胜感激!
我已经尝试了很多不同的方法,我认为问题在于CI 4没有从C++应用程序接收Content-Type头。它是显式设置的:
CString strHeaders = _T("Content-Type: application/x-www-form-urlencoded");
下面是同一台服务器上的CI 4和CI 3接收到的头文件的简单打印。(我已经将我的旧CI 3应用程序复制到了CI 4的Public目录中名为'dev'的目录中。)
公用文件夹中CI 3邮件头
host: test.site.com
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Authorization: Basic XXXXXXXXXXXXXXXXXXXX
Content-Type: application/x-www-form-urlencoded
Cookie: ci_session=9do54stine1po2c0tren49gr17eq068g
User-Agent: CustomName
X-Forwarded-For: 96.68.149.126
X-Forwarded-Port: 443
X-Forwarded-Proto: https
Content-Length: 164
Connection: keep-alive
来自CI 3的回复
Subscription number: 9999999999999999
Activation: No
Error: Activation Key does not exist.
来自CI 4的标题
host: test.site.com
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Authorization: Basic XXXXXXXXXXXXXXXXXXXX
Cookie: ci_session=g6v3qlgms2bv3ijv19hpl3cgnvnbg4kk
User-Agent: CustomName
X-Forwarded-For: 96.68.149.126
X-Forwarded-Port: 443
X-Forwarded-Proto: https
Connection: keep-alive
来自CI 4的响应
Subscription number:
Activation: No
Error: No parameters sent.
正如您所看到的,C应用程序连接到CI 3控制器,在标头中包含Content-Type,并返回我所期望的给定参数。但是,CI 4没有接收Content-Type标头,并告诉我没有传递参数。
关于为什么CI 4无法识别C应用程序发送的内容类型,有什么想法吗?
1条答案
按热度按时间0yg35tkg1#
Codeigniter 4在公共.htaccess文件中包含以下内容:
这会删除url后面的斜杠。
保留尾部斜杠。现在C++应用程序能够成功地发布到CI控制器。
我还不知道这会带来什么蠕虫,但它确实解决了问题。