- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
似乎用谷歌搜索 xsendfile 问题会产生许多相互矛盾/过时的结果。
为了全面披露,我正在考虑 xsendfile 1.0 beta,记录在 https://tn123.org/mod_xsendfile/beta/ (这个网站通常不会出现在搜索结果中,只有没有/beta 的网站才会出现)。我在 Linux 和 Windows 上将它与 apache 2.4 和 php 5.4.34 一起使用。除了是最新版本之外,我还需要使用测试版,因为只有测试版站点具有使用 VC9 为 apache 2.4 构建的 Windows 二进制文件。
我在阅读文档时犯了一个错误,标题中文件名值的描述是这样说的:
The value (file name) given by the header is assmumed to be url-encoded, i.e. unescaping/url-decoding will be performed. See XSendFileUnescape. If you happen to store files using already url-encoded file names, you must "double" encode the names... %20 -> %2520
XSendFIleUnescape 的描述是这样的:
Setting XSendFileUnescape off will restore the pre-1.0 behavior of using the raw header value, instead of trying to unescape/url-decode first.
关于相对路径的文档非常清楚地表明 X-SendFile
header 上的文件名应该是完整路径名。所以我通过 php 的 urlencode
函数仔细地运行我的路径名。
对我来说,最终结果总是在 Linux 和 Windows 上出现服务器内部错误(500 状态代码)。当我在 server config
上下文中有我的 XSendFilePath 指令时,文档说这是允许的,但我的错误日志中没有更具体的内容。但是当我(最终)将该指令移动到 Directory
上下文时,我逐渐在我的错误日志中得到了这个:
(404)Unknown error: [client 127.0.0.1:20742] xsendfile: bad file name encoding
最终,出于绝望,我说“去他妈的文档”,并删除了路径名上的 urlencode
。突然间它开始完美运行(Windows 和 Linux)!!!
我没有任何包含非 ASCII 字符的路径名,所以我已经准备好了。但我确实想知道应该应用哪种编码来允许非 ASCII 字符工作。如果你用谷歌搜索 xsendfile: bad file name encoding
,你会在 https://github.com/nmaier/mod_xsendfile/blob/master/mod_xsendfile.c 找到以下源代码该消息字符串是通过采用以下的真实分支生成的:
rv = ap_unescape_url(file);
if (rv != OK) {
但是我找不到ap_unescape_url()
的好的描述或源代码。除非 github 上的源代码已过时,否则该函数反对 PHP 的 urlencode()
函数执行的简单 % 编码。作为一个疯狂的猜测,我尝试调用 ap_escape_url()
,但它没有在 PHP 中定义。因此,问题是应该将什么编码应用于X-SendFile
header 中的路径名参数??
另一个观察/问题XSendFile
使用“apache internals”发送文件的描述可能会让您认为它会使用 mod_mime< 从文件扩展名构造一个
。但实际上并非如此,示例显示了对 Content-Type
header Content-Type
的显式 header()
调用。所以我的后续是从传递给 X-SendFile
的路径名构造该 header 的“正确”方法是什么,这样它就可以保证匹配 mod_mime
如果我们不使用 X-SendFile
会怎样?我能想出的最好的办法是使用 PHP 的 fileinfo
扩展名的以下代码——但据我所知,没有特别的理由期望它在给定文件名的 url 时实际上会匹配 apache 所做的事情.
$finfo = new finfo(FILEINFO_MIME);
$mime_info = $finfo->file($pathname);
if (! strlen($mime_info)) {
$mime_info = 'application/octet-stream; charset=binary';
}
$basename = basename($pathname);
$encoded = "$pathname";
header("Content-Type: $mime_info");
header("Content-Disposition: attachment; filename=\"$basename\"");
header("X-SendFile: $encoded");
最佳答案
我不会接受这个作为问题的答案,因为我还没有找到预期使用的“那个”编码函数。但我确实找到了这个古老的 Apache API 文档:http://pedrowa.weba.sk/docs/ApiDoc/apidoc_ap_unescape_url.html .它将 ap_unescape_url() 的返回值记录为:
Returns 0 on success, BAD_REQUEST if a bad escape sequence is found, or NOT_FOUND if %2F (/) is found.
当然,在 PHP 中,urlencode() 和 rawurlencode() 都将 '/' 编码为 %2F。
很明显,XSendFile header 中使用的任何完整路径名都必须不使用这些函数中的任何一个进行 urlencoded!!
我对我使用的“最佳”解决方案的猜测:
$encoded = str_replace('%2F', '/', rawurlencode($pathname));
我必须承认,我很惊讶 XSendFile 文档没有提到这一点。更令我惊讶的是,这个问题在这里没有得到任何答案。我应该在不同的 Stack Exchange 网站上发布这个吗?
关于php - xsendfile 期望什么编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26769144/
我对自定义 CSS 或在将图像作为 Logo 上传到页面时使用编码 block 有疑问。我正在为我的网站使用 squarespace,我需要帮助编码我的 Logo 以使其适合每个页面。一个选项是使用自
如 encoding/json 包文档中所述, Marshal traverses the value v recursively. If an encountered value implement
我必须做一些相当于Java中的iconv -f utf8 -t sjisMS $INPUT_FILE的事情。该命令在 Unix 中 我在java中没有找到任何带有sjisMS的编码。 Java中有Sh
从 PHP 5.3 迁移到 PHP 5.6 后,我遇到了编码问题。我的 MySQL 数据库是 latin1,我的 PHP 文件是 windows-1251。现在一切都显示为“ñëåäíèòå àäðå
我有一个 RScript文件(我们称之为 main.r ),它引用了另一个文件,使用以下代码: source("functions.R") 但是,当我运行 RScript 文件时,它提示以下错误:
我无法设法从 WSDL 创建 RPC/编码风格的代码 - 有谁知道哪个框架可以做到这一点? 带有 adb 和 xmlbeans 映射的 Axis2 无法正常工作(无法处理响应中的肥皂编码)直接使用 X
安装了最新版本的Node.Js()和npm包**(1.2.10)**当我运行 Express 命令来生成项目时,它向我抛出以下错误 buffer.js:240 switch (encoding &
JavaScript中有JSON编码/解码base64编码/解码函数吗? 最佳答案 是的,btoa() 和 atob() 在某些浏览器中可以工作: var enc = btoa("this is so
>>> unicode('восстановление информации', 'utf-16') Traceback (most recent call last): File "", line
我当然熟悉 java.net.URLEncoder 和 java.net.URLDecoder 类。但是,我只需要 HTML 样式的编码。 (我不想将 ' ' 替换为 '+' 等)。我不知道任何只做
有一个非常简单的 SSIS 包: OLE DB Source 通过 View 获取数据(数据库表 nvarchar 或 nchar 中的所有字符串列)。 派生列,用于格式化现有日期并将其添加到数据集(
我正在使用一个在 Node 中进行base64编码的软件,如下所示: const enc = new Buffer('test', 'base64') console.log(enc) 显示: 我正
我试图将带有日语字符的数据插入到 oracle 数据库中。事情是保存在数据库中的是一堆倒置的问号。我该如何解决这个问题 最佳答案 见 http://www.errcode.net/blogs/?p=6
当我在 java 中解压 zip 文件时,我发现文件名中出现了带有重音字符的奇怪行为。 西索: Add File user : L'equipe Technique -- Folder : spec
在网上冲浪我找到了 ExtJS 的 Ext.Gantt 插件,该扩展有一个特殊的编码。任何人都知道如何编码那样或其他复杂的形式。 Encoded Gantt Chart 最佳答案 它似乎被 Dean
我正在用C语言做一个编码任务,我进展顺利,直到读取符号并根据表格分配相应的代码的部分。我必须连接几个代码,直到它们的长度达到 32 位,为此我必须将它们写入一个文件中。这种写入文件的方法给我带来了很多
我有一个外部链接的 javascript 文件。在那个 javascript 里面,我有这个功能: function getMonthNumber(monthName){ monthName = mo
使用mechanize,我检索到一个网页的源页面,其中包含一些非ASCII字符,比如汉字。 代码如下: #using python2.6 from mechanize import Browser b
我有一个包含字母 ø 的文件。当我用这段代码 File.ReadLines(filePath) 读取它时,我得到了一个问号而不是它。 当我像这样添加编码时 File.ReadLines(filePat
如何翻译下面的字符串 H.P. Dembinski, B. K\'{e}gl, I.C. Mari\c{s}, M. Roth, D. Veberi\v{c} 进入 H. P. Dembinski,
我是一名优秀的程序员,十分优秀!