如何使文件看起来像在服务器上的根目录中

vor*_*ent 0 php ftp .htaccess apache2

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

我想授予对此文档根目录下的子文件夹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>
Run Code Online (Sandbox Code Playgroud)

我也试过了

RewriteCond  %{DOCUMENT_ROOT}/ftp-upload/${REQUEST_FILENAME} -f
Run Code Online (Sandbox Code Playgroud)

RewriteCond %{DOCUMENT_ROOT}/ftp-upload%{REQUEST_URI} -f
Run Code Online (Sandbox Code Playgroud)

这是一项正在进行的工作,所以这不是最终的解决方案,但是这个功能正在被要求很多.如果可能的话,我宁愿不让他们访问文档根目录.

更新:它看起来像什么工作,什么时候需要......

如果我输入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编辑,因为我的服务器表现得很时髦..

Mic*_*eim 7

事实,因为我理解他们(如果错误,请纠正我)

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

对于上述事实,这是一个工作.htaccess文件.请注意,我是所使用的文件夹名称ftp-upload,你已经使用了几种不同的版本在你的问题(ftp-upload,ftp_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]
Run Code Online (Sandbox Code Playgroud)

我所做的是检查子文件夹中是否存在所请求的文件/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文件:

    • vhost配置中的AllowOverride指令.
    • 通常的价值是 AllowOverride All
    • 您可以通过givemeanerror on在.htaccess中添加无效(例如)的内容并在Web浏览器中打开页面来测试.如果读取.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,输入URL http://yourdomain.com/test.png并复制结果

希望这可以帮助 :)