【问题标题】:How to prevent http request from displaying resources in a PHP MVC / LAMP如何防止 http 请求在 PHP MVC / LAMP 中显示资源
【发布时间】:2012-11-30 11:37:03
【问题描述】:

我正在重新定义我自己的 php mvc 框架。

默认情况下,我的每个请求都由 /index.php 处理,这会触发路由的 mvc 过程,执行请求并返回正确的视图。每个请求都根据单个 'q' GET 参数进行路由,drupal 风格,如

/index.php?q=anApplication/aController/theAction/arg1/.../moreArguments

这很好用,并且通过 mod_rewrite 使干净的 url 变得容易。好的。

我有一个这样的目录树:

/public
    |----themeName
    |--------|
             |----page.tpl
             |----content.tpl
             |----etc.    
/private
    |----sourceDirectory
    |----moreSources

不想要是存储在私有和公共目录中的文件,可以像 HTTP 请求一样直接提供服务:我不想要像

这样的东西

mySrv/public/themeName/page.tpl

绕过我的核心处理程序 - index.php,显示无效模板或任何不是图像的资源。

我想我可以通过这样的重写配置来实现一些目标

RewriteEngine on
RewriteBase /
RewriteRule  ^(.*)$ index.php?q=$1 [QSA,L]

但该框架只能在启用 mod_rewrite 的网站上运行,因为这将重写所有现有和不存在的资源。

我要问的是:是否有另一种方法可以让每个请求都由我选择的资源(例如 index.php)提供服务,现有或不存在的资源?

谢谢

【问题讨论】:

  • 为什么公用文件夹中有模板?
  • 因为我通常与css、js等通用资源共享模板文件夹
  • 这不是个好主意,恕我直言。

标签: php apache model-view-controller mod-rewrite lamp


【解决方案1】:

只需将所有模板等存储在 public_html 文件夹之外。

这将允许 PHP 访问,但外界无法访问该文件。

【讨论】:

  • +1。但是为什么不使用愚蠢的常量来防止直接访问它们呢?
【解决方案2】:

最简单且更便携的方法是将除index.php 之外的所有内容从文档根目录中拉出。 PHP 仍然可以包含文件并执行其他所有操作。

这个我没试过,但是如果你把 index.php 放在旧文档树之外

---/ app / new-index.php
   |
   / public / 
   |
   / private / ...
   |
   index.php

然后在new-index.php开头添加

<?php
    chdir('..');
    require 'index.php';
?>

最后重新配置 Apache,使 DocumentRoot 实际上变为 /app,然后一切都应该像以前一样工作——除了 '/' 之外的任何 URL 对 Apache 不再有意义,并且所有 URL 都可以放在合适的 ErrorDocument 上404.

注意:“一切都应该工作”,除了 HTTP 重定向。您可以从 FS 读取非解释的 PHP 文件,但您不能再从本地主机上的 Apache 获取其解释的内容。此外,您应该验证任何现有代码都没有使用DOCUMENT_ROOT 全局变量;如有必要,您可以覆盖它。

【讨论】:

    猜你喜欢
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多