当用户访问服务器上的目录时显示404错误


Show a 404 error when users access a directory on the server

我正在编写一个小型php网站,我试图正确地构建它,以便集中处理请求,并且有一个单一的代码入口。

所以我使用这里描述的单个入口点的指南:https://thomashunter.name/blog/php-navigation-system-using-single-entry-point/

mod_rewrite规则在请求服务器上实际存在的目录之前工作得很好。我禁用了目录索引,但现在访问行为不同,取决于URL中是否有尾斜杠。有了斜杠,一切都按照我想要的方式进行(URL栏是www.example.com/images/,服务器返回由我的php脚本创建的404),但没有斜杠,URL被重写为www.example.com/index.php?s=images,这看起来很乱,暴露了太多关于我的网站结构的信息。

看到它是如何使用尾斜杠的,理想情况下,我希望它在没有尾斜杠的情况下以同样的方式工作。否则,如果它在任何情况下都不起作用,我将满足于简单的重定向,尽管我不喜欢突出显示实际目录的想法。

我的.htaccess是这样的:

RewriteEngine On
RewriteRule ^([a-zA-Z0-9_]+)/?$ index.php?s=$1 [QSA]
Options -Indexes
ErrorDocument 403 index.php 

我也放了一个头重定向,但?s=images仍然被附加到URL(我知道这可以写得更好,但我正在试验各种组合的时刻):

if (startsWith($_SERVER['REQUEST_URI'], "/main"))
{
    header('Location: '.'/');
    exit;
}
else if (startsWith($_SERVER['REQUEST_URI'], "/images"))
{
    header('Location: '.'/');
    exit;   
}

其中startsWith的定义是(取自这个StackOverflow答案):

function startsWith($haystack, $needle)
{
    return $needle === "" || strpos($haystack, $needle) === 0;
}

最后,我正在寻找一个解决方案,不需要复制虚拟index.php s到每个目录,因为这可能难以维护。如有任何帮助或指导,将不胜感激。

您需要某种routing,要么仅通过PHP中的apache路由url,要么通过可用的库之一(apache+ PHP)

(比如这个http://www.slimframework.com/)