【问题标题】:htaccess to open file with encoded filenamehtaccess 用编码的文件名打开文件
【发布时间】:2019-09-18 12:19:24
【问题描述】:

我有一个用户可以上传文件的网站,如果他们上传文件名中包含特殊字符的文件,则文件名将被编码(例如:iordănescu.pdf 将变为 iord%C4%83nescu.pdf)

这会导致无法从网站上的链接打开这些文件,我无法使用website.com/iordănescu.pdfwebsite.com/iord%C4%83nescu.pdf 打开文件它仅在编码文件名被编码时才有效(所以双重编码)像这样:website.com/iord%25C4%2583nescu.pdf

这是我在文件上传到的文件夹中的 htaccess 文件:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

# remove language from url for file viewing
RewriteRule ^[A-Za-z]{2}/frontend/files/jobs/(.*)$          frontend/files/jobs/$1 [B,L,R=301]

这将重定向到:website.com/iordănescu.pdf,并将给出以下错误:在此服务器上找不到请求的 URL /frontend/files/jobs/iordănescu.pdf。

【问题讨论】:

    标签: apache .htaccess urlencode


    【解决方案1】:

    您可以尝试对特殊字符进行 json 编码。 示例:

    //special character json_encode
    protected function _normJsonStr($str){
        $str = preg_replace_callback('/\\\\u([a-f0-9]{4})/i', create_function('$m', 'return chr(hexdec($m[1])-1072+224);'), $str);
        return iconv('cp1251', 'utf-8', $str);
    }
    
    //convert utf8
    protected function _utf8ize($d) {
        if (is_array($d)) {
            foreach ($d as $k => $v) {
                $d[$k] = $this->_utf8ize($v);
            }
        } else if (is_string ($d)) {
            return utf8_encode($d);
        }
        return $d;
    }
    

    使用:return $this->_normJsonStr(json_encode($this->_utf8ize($data)));

    【讨论】:

    • 我想先看看是否可以使用 htaccess,因为 URL 位于后端的不同页面上,上传文件时自动发送电子邮件,......所以这将是相当多的工作使用这样的功能更改所有这些页面。
    猜你喜欢
    • 1970-01-01
    • 2021-06-26
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 2014-12-02
    • 2021-11-14
    相关资源
    最近更新 更多