【发布时间】:2014-08-11 20:01:19
【问题描述】:
我正在编写一个小型 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 的定义是 (taken from this StackOverflow answer):
function startsWith($haystack, $needle)
{
return $needle === "" || strpos($haystack, $needle) === 0;
}
最后,我正在寻找一种不需要将虚拟index.phps 复制到每个目录的解决方案,因为这样会很难维护。任何帮助或指导将不胜感激。
【问题讨论】:
-
您可以使用 mod_rewrite 来限制对除您想要允许的目录之外的所有目录的访问。我相信 CodeIgniter 做得很好。它不允许访问存储所有主要代码的系统或应用程序目录。我建议看看 .htaccess 。
标签: php apache .htaccess mod-rewrite