我正在將我們的網站從 Codeigniter 3 升級到 Codeigniter 4。到目前為止,這很乏味,但大部分進展順利。我現在遇到了一個控制器問題,該控制器無法識別用 C 撰寫的應用程式中的發布值。這個應用程式已經使用 CI 3 多年了,但是......好吧,CI4。我不知道有關 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.
如果確實沒有發送任何引數,最后兩行(激活和錯誤)是我希望從該控制器獲得的。
哦 - 不,我沒有在我的 CI 4 應用程式中啟用 CSRF(基于默認 Cookie 的 CSRF 保護除外)。
任何想法將不勝感激!
我嘗試了許多不同的方法,并認為問題在于 CI4 沒有從 C 應用程式接收 Content-Type 標頭。它是這樣明確設定的:
CString strHeaders = _T("Content-Type: application/x-www-form-urlencoded");
這是 CI4 和 CI3 在同一服務器上接收到的標頭的簡單列印。(我已將我的舊 CI3 應用程式復制到 CI4 的公共目錄中名為“dev”的目錄中。)
公共檔案夾中 CI3 的標頭
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
CI3 的回應
Subscription number: 9999999999999999
Activation: No
Error: Activation Key does not exist.
來自 CI4 的標頭
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
CI4 的回應
Subscription number:
Activation: No
Error: No parameters sent.
如您所見 - C 應用程式連接到 CI3 控制器,在標頭中使用 Content-Type 并回傳給定我傳入的引數的預期結果。但是,CI4 沒有收到 Content-Type 標頭并告訴我沒有傳遞任何引數。
關于為什么 CI4 無法識別 C 應用程式發送的 Content-Type 的任何想法?
uj5u.com熱心網友回復:
Codeigniter 4 在公共 .htaccess 檔案中有以下內容:
# Redirect Trailing Slashes...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (. )/$
RewriteRule ^ %1 [L,R=301]
從 url 中洗掉尾部斜杠。REMing出這三行
# Redirect Trailing Slashes...
# RewriteCond %{REQUEST_FILENAME} !-d
# RewriteCond %{REQUEST_URI} (. )/$
# RewriteRule ^ %1 [L,R=301]
將尾部斜杠留在原處。現在 C 應用程式能夠成功發布到 CI 控制器。
我還不知道可能會打開什么蠕蟲,但它確實解決了問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/487743.html
下一篇:多個css類有什么作用?
