0

我有单独的域指向专用框上的单独文档根

我想授予对此文档根目录下的子文件夹 ftp-upload 的 FTP 访问权限。

正确的 FTP 配置不是这个问题的一部分

如果授权人将文件上传到 document_root/ftp-upload,则该文件应该可以通过 domain.com/file 而不是 domain.com/ftp-upload/file 访问

.htaccess 文件位于文档根目录中

我已经尝试了一些东西,但它们似乎不起作用。

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /
    ## check if the file exists in subfolder
    ##   ...and if found, stop and display it
    RewriteCond %{DOCUMENT_ROOT}/ftp-upload/$1 -f [OR]
    RewriteCond %{DOCUMENT_ROOT}/ftp-upload/$1 -d
    RewriteCond $1 !^$
    RewriteRule  (.*)  %{DOCUMENT_ROOT}/ftp-upload/$1 [L]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond $1 !^(index\.php|images|robots\.txt|css|assets|ftp-upload)
    RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>

我也试过

RewriteCond  %{DOCUMENT_ROOT}/ftp-upload/${REQUEST_FILENAME} -f

RewriteCond %{DOCUMENT_ROOT}/ftp-upload%{REQUEST_URI} -f

这是一项正在进行中的工作,因此这不会是最终解决方案,但是很多人都要求此功能。如果可能的话,我宁愿不让他们访问文档根目录。

更新:看起来事情确实有效,当它想要......

如果我输入 domain.com/test.txt (仅存在于 ftp-upload 目录中),请求将转到 domain.com/index.php/test.txt 并为我提供主页

如果我输入 domain.com/ftp-upload/ 我会得到一个目录列表,包括 test.txt

如果我点击 test.txt 我会得到文件内容(这是“它有效!”)。如果我然后输入 domain.com/test.txt 我会再次显示文件内容...

我的头爆炸了……有什么想法吗?

解决了另一种方法,这里的答案在我的服务器上不起作用。

我现在构建的 CMS 有另一个用户组“SEO 优化”和一个上传部分。在该部分下,用户可以选择要将文件上传到他分配的哪个位置。如果上传文件夹中存在所请求的文件,则网站 index.php(控制器/路由器)将提供该文件。没有 .htaccess 编辑,因为我的服务器表现得很时髦..

4

5 回答 5

7

我理解的事实(如有错误请纠正我)

  • 您有单独的域指向单独的文档根
  • 您想授予 FTP 访问ftp-upload此文档根目录下的子文件夹的权限。
  • 正确的 FTP 配置不是这个问题的一部分
  • 如果授权人将文件上传到document_root/ftp-upload,则该文件应该可以通过domain.com/file而不是domain.com/ftp-upload/file
  • .htaccess 文件位于文档根目录中

对于上述事实,这是一个工作.htaccess文件。请注意我使用的文件夹名称是ftp-upload,你在你的问题中使用了几个不同的版本(,,, ftp-uploadftp_upload确保ftpupload这在你的配置中是一致的

.htaccess 在您的域文档根文件夹中

RewriteEngine On
RewriteBase /
RewriteCond %{DOCUMENT_ROOT}/ftp-upload%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}/ftp-upload%{REQUEST_URI} -d 
RewriteRule ^(.*)$  ftp-upload/$1       [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index\.php|images|robots\.txt|css|assets)
RewriteRule ^(.*)$  index.php/$1        [L]

我所做的是检查子文件夹中是否存在请求的文件/ftp-upload

棘手的是这RewriteCond file -f需要一个完整的路径。这就是为什么您通常会测试%{REQUEST_FILENAME}% 如果此条件为真(文件存在)只需将请求重写为ftp-upload/filename

这也适用于ftp-folder例如文件夹中的子文件夹ftp-folder/test/image.png将可以访问/test/image.png

第二部分只是您通常的“如果文件不存在,则重写到/index.php”

编辑

在旁注上

OP 表示“这不起作用” - 好吧,谢谢你的尝试 - 在这个有用的评论之后我差点删除我的答案,但是在我投入这篇文章的工作之后,因为我验证了建议的解决方案可以完美运行,我决定喘口气,提供一些调试技巧。

这就是说,如果这对您不起作用:

  • 确保您的“隐藏”上传文件夹实际上被调用ftp-upload,此外,Linux区分大小写
  • 确保您的网络服务器配置为读取 .htaccess 文件:

    • 虚拟主机配置中的AllowOverride指令。
    • 通常的价值是AllowOverride All
    • 您可以通过在您的 .htaccess 中添加一些无效的内容(例如givemeanerror on)来简单地对此进行测试,然后在您的网络浏览器中打开该页面。如果您的 .htaccess 文件被读取,您将在浏览器中收到 500 Internal Server 错误消息。如果您没有测试环境,可以在测试子文件夹中执行此操作
  • 我在上面发布的配置应该替换放置在您(不在 ftp-upload 文件夹内)中的文件的全部内容,以便调试甚至删除包装器,一旦它工作就可以放回.htaccessDOCUMENT_ROOT<IfModule>

  • 为了测试,将图像文件复制到您的 ftp-upload 文件夹中,假设test.png

  • 如果您仍然无法在浏览器中访问http://yourdomain.com/test.png,我想查看此请求的响应标头
  • 如果您不知道如何查看响应标头,请访问http://www.webconfs.com/http-header-check.php,输入 URLhttp://yourdomain.com/test.png并复制结果

希望这可以帮助 :)

于 2013-01-22T21:43:07.270 回答
1

请检查我根据您的需要创建的这个空间http://dev.wadakkir.org/test/

这是前一个空间的结构:

那是你需要的吗?

如果是这样,我可以使用以下 .htaccess 文件执行此行为

Options +Indexes
RewriteCond  %{REQUEST_URI} !^/test/subF/
RewriteRule ^(.*)$ /test/subF/$1

在你的情况下,它应该是这样的:

Options +Indexes
RewriteCond  %{REQUEST_URI} !^/ftp-upload/
RewriteRule ^(.*)$ /ftp-upload/$1

希望它有帮助,如果没有,我仍然可以再试一次:)

更新

正如我之前的评论中所建议的,以下是一个快速编写的网关,您可以查看http://dev.wadakkir.org/test/的执行示例(我会放一段时间)

以下是我使用的源代码:

索引.php

<?php

require_once 'gateway.php';

echo "<h1>Hello World!</h1>";
?>
Existing file names are:
<ul>
    <li>01_Content_Of_Test_Folder.png</li>
    <li>02_Content_Of_SubF_Folder.png</li>
    <li>2ndTst.txt</li>
    <li>tst.txt</li>
</ul>

网关.php

<?php

if( !empty($_GET['cf']) ){
$filename = "./subF/".$_GET['cf'];
if( is_file( $filename ) )
    dwldFunction($filename);
else{
    // TODO change this to what ever you want
    die("File not found ($filename)");
    }
    exit(1);
}


function dwldFunction( $fName ) {
// detect mime type
$mime = getMime( $fName );

header('Pragma: public');   
header('Expires: 0');       
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: private',false);
header('Content-Type: '. $mime );
header('Content-Disposition: attachment; filename="'.basename($fName).'"');
header("Content-Length: " . filesize($fName));
header('Connection: close');

readfile( $fName );
}

function getMime( $fName ) {
    $r = pathinfo($fName);
    $m ;
    //TODO: 
    // complete the following list or use
    //$finfo = finfo_open(FILEINFO_MIME_TYPE);
    //finfo_file($finfo, $fName);
    //finfo_close($finfo);
    // @: http://php.net/manual/en/function.finfo-file.php
    switch ( $r['extension'] ){
        case "pdf":
            $m = "application/pdf";
            break;
        case "txt":
            $m = "text/plain";
            break;
        case "png":
                $m = "image/png";
            break;
    }
    return $m;
}

.htaccess内容是:

Options +Indexes

RewriteCond %{REQUEST_URI} !^/test/subF/
RewriteCond %{REQUEST_URI} !index.php
RewriteCond %{REQUEST_URI} !subF
RewriteRule ^(.*)$ /test/index.php?cf=$1

您可以从此链接下载完整的源代码

于 2013-01-28T12:51:29.577 回答
0

所有这些答案对我来说似乎过于复杂

假设我们的目录结构如下

/home/user/www/ {web 根目录} /home/user/ftpuploadfolder/ {ftp 文件夹}

并且您希望该文件夹通过 apache 显示为 /home/user/www/folder

为什么不只创建一个符号链接?ln -s /home/user/ftpuploadfolder/ /home/user/www/publicfolder/

这样做,您可以对链接文件夹拥有不同的权限,例如 apache 只能访问公共文件夹(不是公共读/写等),而 ftp 只能访问您的 ftpuploadfolder

于 2013-01-24T09:55:23.527 回答
0

我会使用 PHP 文件来读取想要的文件(在本例中位于子文件夹中),然后将其输出给用户。但是,我认为您的解决方案可以在以下答案中找到:

https://stackoverflow.com/a/1851873/1794894

于 2013-01-28T21:58:26.390 回答
0
RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^yourhost.com|^www.yourhost.com
RewriteCond %{REQUEST_URI} !^/new
RewriteRule ^(.*)$ new/$1 [L]

这个意思

www.yourhost.com/new/

实际上是

www.yourhost.com

于 2013-01-29T21:10:47.387 回答