0

我正在尝试使用代码点火器框架中的 xsendfile 向用户发送文件。

一切都安装正确,我的问题是它似乎只能从路线上工作,即使每个页面都来自 index.php 。

这是我的功能:

function _output_file($name, $root_location, $public_location = FALSE)
{
    if (function_exists('apache_get_modules') && in_array('mod_xsendfile', apache_get_modules())) {
        header ('Content-Description: File Transfer');
        header ('Content-Type: application/octet-stream');
        if (strstr($_SERVER["HTTP_USER_AGENT"], "MSIE") != FALSE) {
            header ('Content-Disposition: attachment; filename='.urlencode($name));
        } else {
            header ('Content-Disposition: attachment; filename="'.$name.'"');
        }
        //86400 is one day
        header ('Expires: '.gmdate('D, d M Y H:i:s', (TIME_NOW + 86400)));
        header ('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header ('Pragma: public');
        header ('X-Sendfile: '.$root_location);
        exit;
    } else {
        redirect(site_url($public_location));
    }
}

如果我把它放在我的 index.php 的顶部并加载根它工作正常,但如果我尝试从 domain.com/controller/function 访问它,它会返回 404 错误。

它肯定是在使用 index.php 文件,因为如果我用 die("test"); 替换函数调用;这显示在屏幕上。

我相信这与 xsendfile 必须访问该文件的权限有关,但由于它是从根 index.php 工作的,我原以为它会拥有完整的权限,大概它基于请求 url 是什么,我觉得很奇怪.

所以....有没有人对我如何让xsendfile通过codeigniter工作有任何建议,比如“domain.com/files/get/12”这样的url?

4

4 回答 4

0

XSendFile 有一些特定的与安全相关的路径怪癖......并且根据您的服务器配置,即使 HTTP 似乎正常工作,这些问题有时也会通过 HTTPS 发生。

如果您在使用 mod_xsendfile 时遇到了神秘的 404,并且您可以确认所服务的文件确实存在,那么您可能需要XSendFilePath在 Apache confs 中进行配置。

将以下内容添加到适当的 conf ( httpd.conf, ssl.conf, httpd-ssl.conf, 等) 和/或适当的 VirtualHost 声明中(如果使用 vhosts)...

XSendFilePath /Absolute/Path/To/Your/Working/Directory/

注意:您不能将其添加到.htaccess文件中。它必须放在 Apache conf 中。

通常,xsendfile 会尝试自动找出工作目录,但有时不能。该指令明确告诉它应该通过 xsendfile 访问哪个目录(或目录)。有可能一个神秘的 404 意味着您的目录由于某种原因没有通过白名单检查。这将解决这个问题。

并且不要忘记在更改配置后重新启动 apache。

于 2016-06-01T16:39:28.190 回答
-1

使用下划线前缀方法名称使其无法通过 URL 访问。

从文档中:

私有函数

在某些情况下,您可能希望对公共访问隐藏某些功能。要将函数设为私有,只需添加下划线作为名称前缀,它将不会通过 URL 请求提供。例如,如果你有这样的功能:

private function _utility()
{
    // some code
}

像这样尝试通过 URL 访问它是行不通的:example.com/index.php/blog/_utility/

于 2011-09-20T14:24:21.217 回答
-1

似乎这个答案从未得到回应,最后我只是在我的根目录中创建了一个名为“getfile.php”的文件,它并不完美,但它现在可以完成工作,这里适用于任何可能觉得它有用的人。

<?php
define('BASEPATH', 'just done to stop direct access being disallowed');

function show_getfile_error()
{
    echo 'You do not have permission to download this file, if you think this is a mistake please get in contact.';
    exit;
}

include('applications/config/database.php');
$mysqli = new mysqli($db['default']['hostname'], $db['default']['username'], $db['default']['password'], $db['default']['database']);
if(!preg_match('%^[0-9]+$%', $_GET['key']))
{
    show_getfile_error();
}
else
{
    $query = mysqli_query($mysqli, 'SELECT * FROM getfiles WHERE getfile_key = '.(int)$_GET['key']);

    $result = mysqli_fetch_array($query, MYSQLI_ASSOC);

    if(!$result || $result['getfile_ip'] != $_SERVER['REMOTE_ADDR'])
    {
        show_getfile_error();
    }

    header ('Content-Description: File Transfer');
    header ('Content-Type: application/octet-stream');
    if (strstr($_SERVER["HTTP_USER_AGENT"], "MSIE") != FALSE) {
        header ('Content-Disposition: attachment; filename='.urlencode($result['getfile_name']));
    } else {
        header ('Content-Disposition: attachment; filename="'.$result['getfile_name'].'"');
    }
    //86400 is one day
    header ('Expires: '.gmdate('D, d M Y H:i:s', (TIME_NOW + 86400)));
    header ('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header ('Pragma: public');
    header ('X-Sendfile: '.$result['getfile_location']);
}
?>
于 2011-09-24T12:56:05.637 回答
-1

我今天遇到了404错误。如果您传递给标头的路径包含位于 index.php 所在根文件夹之外的任何组件,那么您会得到 404。确保该路径是对于 index.php,而不是绝对路径。

于 2012-01-03T01:08:00.730 回答