我正在编写一个小型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/)