PHP文件浏览器mod_重写

PHP文件浏览器mod_重写,php,apache,.htaccess,mod-rewrite,apache2,Php,Apache,.htaccess,Mod Rewrite,Apache2,我正在用PHP开发一个相当简单的文件浏览器 这些文件位于/home/web/www/archive中 应与存档下的相应文件匹配的请求为/files /files/sub/file.txt => /home/web/www/archive/sub/file.txt (dump as is) /files/file.png => /home/web/www/archive/file.png (dump as is) /files => /home/web/www/archive (

我正在用PHP开发一个相当简单的文件浏览器

这些文件位于/home/web/www/archive中

应与存档下的相应文件匹配的请求为/files

/files/sub/file.txt => /home/web/www/archive/sub/file.txt (dump as is)
/files/file.png => /home/web/www/archive/file.png (dump as is)
/files => /home/web/www/archive (directory, handled by /home/web/www/index.php)
/files/sub => /home/web/www/archive/sub (directory, handled by /home/web/www/index.php)

我希望我的.htaccess能够识别它是否是archive/下的文件,如果是,请按原样输出文件。如果没有,请将其发送到index.php。

您的.htaccess中的以下内容会将任何非文件的内容发送到index.php

RewriteCond %{REQUEST_URI} !\/files\/(.*)\.[a-z]+$
RewriteRule .* index.php
因此,任何没有文件名终止的请求(.jpg、.bat、.txt、.etc)都将转到您的索引


已更新,因此它现在应该可以工作。

您可以使用
-f
标志:

RewriteEngine On

# if the request is for /archive..
RewriteCond %{REQUEST_URI} ^\/archive\/
# and the request is not for a file
RewriteCond %{REQUEST_FILENAME} !-f

# send to index.php
RewriteRule .* index.php [L]
请注意,对于不存在的文件的文件请求,这也会重定向到index.php。您可以添加对目录
RewriteCond%{REQUEST\u FILENAME}-d
的肯定检查,因此仅当您请求一个目录时,它才会重定向


请求不在/archive。。。它是/文件。。。这意味着我不能使用-f直接。请求没有直接指向文件,因此这不起作用。在您的问题中,您说请求是
/files/sub/file.txt=>/home/web/www/archive/sub/file.txt
/files/sub=>/home/web/www/archive/sub
。因此,您的第一个请求直接指向一个文件,因此htaccess将忽略该请求,第二个请求指向一个文件夹,因此它将进入索引。但是请求文件名将与/home/web/www/archive不匹配。如果请求为/files,它将尝试匹配不存在的/home/web/www/files。请求从未被删除/存档。
RewriteCond %{REQUEST_URI} ^/files/(.*)$
RewriteCond %{DOCUMENT_ROOT}/archive/%1 -f
RewriteRule .* %{DOCUMENT_ROOT}/archive/%1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]