【问题标题】:Show a 404 error when users access a directory on the server当用户访问服务器上的目录时显示 404 错误
【发布时间】: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


【解决方案1】:

你想要某种 routing,要么只通过 apache Routing URLs in PHP,要么通过其中一个可用的库 (apache+php)

(喜欢这个http://www.slimframework.com/

【讨论】:

猜你喜欢
  • 2018-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-24
  • 2020-07-28
  • 1970-01-01
  • 2016-05-10
相关资源
最近更新 更多