臨時解決方案可以參考:nginx服務器中文url無法訪問導致404報錯臨時方案

http請求中的中文編碼與網站服務器上的文件名儲存編碼不一致一定會導致404。

記錄一下問題解決的思路與方案。

url編碼亂碼

情景

nignx環境,dede程序(gbk版本)上傳中文文件(程序已修改禁止自動重命名),url請求經測試為gbk編碼,上傳后的文件名卻為utf8編碼。

測試:

于是手動寫了個簡單的php上傳腳本,發現:如果處理該文件上傳的php程序文件為gbk編碼,則上傳的文件就是gbk編碼;如果是utf8,則文件也是utf8,與程序中編碼聲明無關。

因此我將dede中select_soft_post.php文件編碼改成了gbk編碼,但前端上傳結果提示亂碼(意料之中),但是上傳的文件還是utf-8的格式。

至于根本原因可能還不是程序編碼的問題,有待研究。

解決方法

那么有以下三種思路可以解決,

方法一:將請求中的url中文編碼改成utf-8格式

改了nginx.conf中http處于server處的charset為utf-8,但是仍然不奏效,系統環境編碼為utf-8.

方法二:將文件默認儲存名改成gbk編碼

將環境變量給成en_US.GBK后,手動在服務器上新建中文文件,確實為gbk編碼,url可以訪問,但是由程序上傳的文件還是不行,還特地給www用戶環境變量也改了下,仍然不行。

所以這里可以總結出:如果修改環境變量中的編碼,只針對用戶生產文件的編碼,而上傳的文件是經過程序處理過的,并不是www用戶直接生成。

方法三:將上傳后的文件名urlencode編碼一次

只剩這個方法了,在前端返回中文文件名的時候直接把文件名用gb2312編碼一下不就就可以了??

一般程序會直接用urlencode對中文名直接編碼一下,這樣確實可以,但是實測:點擊上傳后的文件后,前端返回的文件名被自動用utf-8解碼了,所以直接顯示就亂碼。

其中返回文件名的js為:

 

<SCRIPT language='JavaScript'>

function nullLink()
{
 return;
}

function ReturnValue(reimg)
{
 if(window.opener.document.<?php echo $f?> != null)
 {
 window.opener.document.<?php echo $f?>.value=encodeURI(reimg);
 }
 
 var funcNum = <?php echo isset($CKEditorFuncNum)? $CKEditorFuncNum : 1;?>;
 if(window.opener.CKEDITOR != null && funcNum != 1)
 {
 
 window.opener.CKEDITOR.tools.callFunction(funcNum, reimg);
 
 }
 window.close();
}
</SCRIPT>

然后再測試一下,然后就很fuck了,因為默認還是用utf-8編碼的,并沒有任何卵用。

百度了一下js的gbk編碼,發現還需要“定制”js。

單獨分享了一篇文章:

js實現gbk格式的urlencode編碼

您的支持將鼓勵我們繼續創作!

[微信] 掃描二維碼打賞

[支付寶] 掃描二維碼打賞