通过apache设置来判断,在这种情况下,您最好的选择是升级到1.4.24+,否则这些重写规则将开始变得复杂,因为您需要指向每个存在的文件。事情是这样的,例如:
url.rewrite = (
"^/index.php$" => "/index.php",
"^/page1.php$" => "/page1.php",
"^/page2.php$" => "/page2.php",
.
.
.
"^/pageN.php$" => "/page.php",
.
.
.
"^/uploads/uploadedfile.pdf$" => "/uploads/uploadedfile.pdf",
.
.
.
"(.*)" => "/index.php?req=$1"
)
如果您的应用程序不会有很多文件,用户需要直接访问你能解决这个问题跟上面。但是,一旦你开始处理上传的内容或任何动态,你将遇到问题。
就我个人而言,我一直通过添加任何不想轻易重写到子目录中的内容来避免这些问题,然后您可以使用通配符(这可能或可能不适用于您的情况) :
url.rewrite = (
"^/content/(.*)$" => "/content/$1",
"(.*)" => "/index.php?req=$1"
)
如果没有上面没有任何用处,你可以使用PHP脚本来满足您的所有动态内容,但这种带有其自身的问题和缺乏灵活性。例如:
<?php
$fullPath = '/path/to/files/' . $_GET['filename'];
if(file_exists($fullPath)){
// Parse Info/Get Extension
$fsize = filesize($fullPath);
$path_parts = pathinfo($fullPath);
$ext = strtolower($path_parts["extension"]);
// Determine Content Type
switch ($ext) {
case "pdf": $ctype="application/pdf"; break;
case "exe": $ctype="application/octet-stream"; break;
case "zip": $ctype="application/zip"; break;
case "doc": $ctype="application/msword"; break;
case "xls": $ctype="application/vnd.ms-excel"; break;
case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
case "gif": $ctype="image/gif"; break;
case "png": $ctype="image/png"; break;
case "jpeg":
case "jpg": $ctype="image/jpg"; break;
default: $ctype="application/force-download";
}
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: $ctype");
header("Content-Disposition: attachment; filename=\"".basename($fullPath)."\";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".$fsize);
} else
exit('File Not Found');
?>
希望帮助
对不起,它不工作,但我可以在我的1.4.20版本中使用这个url.rewrite-if-not-file设置(从1.4.24+重写补丁)。你有什么想法,这个设置有什么好的配置?我无法取代这个lighttpd。 – user1825272