1

我有一个 Web 应用程序,我的所有文件夹都在 public_html 下,如下所示:

public_html
  -pages
  -templates
  -includes
  -styles
  -scripts
  -images
   index.php

所以我的网站在实时服务器上运行完美(使用 php 5.2.17 版本)。但我想改用面向对象的方法并改变了一切,并试图从 zend 框架结构模型中学习和启发,所以我改变了我的文件夹结构和它在本地运行完美,新结构是这样的:

应用程序
  -models
  -controllers
  -views
  -config
  -layouts
    -templates
library
  -functions
public_html
  -styles
  -scripts
  -images
   index.php

所以,我将它转移到实时服务器,现在我的主应用程序不在根目录(public_html)中,当然我不能从 public_html 访问上层根文件夹(应用程序,库),当然也不能通过 url访问 index.php 。
我可以包含它们,但我需要通过锚标记中的url访问,例如在应用程序文件夹内的视图文件夹中访问我的 login.php。此外,需要通过 url 从我的脚本文件夹访问控制器文件夹(用于 ajax 调用等)。
我已经读到我需要使用 .htaccess 文件,但我不知道我应该使用什么规则,我应该把它放在哪里以及如何。请有人帮助我,因为我需要它。请告诉我该怎么办?
问候

4

2 回答 2

2

你错了。仔细看看任何 MVC 框架(例如提到 Zend)。一切都通过公用文件夹中的 index.php。您不需要通过 URL 访问公共文件夹下的任何内容(实际上出于安全原因应该禁止访问)。您可以通过内部程序结构和重写规则访问控制器的操作。通常,每个请求都会被强制路由到 index.php,然后您的应用程序会决定它会进一步去哪里。

于 2012-12-16T17:56:58.460 回答
0

查看 MVC 框架 CodeIgniter 在其自己的index.php文件中处理文件路由的方式:

$system_path = '系统';
$application_folder = '应用程序';
$view_folder = '';

/*
 * ------------------------------------------------- --------------
 *解决系统路径以提高可靠性
 * ------------------------------------------------- --------------
 */

    // 为 CLI 请求正确设置当前目录
    如果(定义('STDIN'))
    {
        chdir(目录名(__FILE__));
    }

    if (($_temp = realpath($system_path)) !== FALSE)
    {
        $system_path = $_temp.'/';
    }
    别的
    {
        // 确保有一个斜杠
        $system_path = rtrim($system_path, '/').'/';
    }

    // 系统路径是否正确?
    如果(!is_dir($system_path))
    {
        header('HTTP/1.1 503 服务不可用。', TRUE, 503);
        exit('您的系统文件夹路径似乎设置不正确。请打开以下文件并更正:'.pathinfo(__FILE__, PATHINFO_BASENAME));
    }

/*
 * ------------------------------------------------- ------------------
 * 现在我们知道了路径,设置主路径常量
 * ------------------------------------------------- ------------------
 */
    // 这个文件的名字
    定义('SELF',路径信息(__FILE__,PATHINFO_BASENAME));

    // 系统文件夹路径
    定义('BASEPATH', str_replace('\\', '/', $system_path));

    // 前端控制器的路径(这个文件)
    定义('FCPATH', str_replace(SELF, '', __FILE__));

    // “系统文件夹”的名称
    定义('SYSDIR',修剪(strrchr(修剪(BASEPATH,'/'),'/'),'/'));

    // “应用程序”文件夹的路径
    if (is_dir($application_folder))
    {
        if (($_temp = realpath($application_folder)) !== FALSE)
        {
            $application_folder = $_temp;
        }

        定义('APPPATH', $application_folder.'/');
    }
    别的
    {
        if ( !is_dir(BASEPATH.$application_folder.'/'))
        {
            header('HTTP/1.1 503 服务不可用。', TRUE, 503);
            exit('您的应用程序文件夹路径似乎设置不正确。请打开以下文件并更正:'.SELF);
        }

        定义('APPPATH', BASEPATH.$application_folder.'/');
    }

    // “views”文件夹的路径
    如果(!is_dir($view_folder))
    {
        if ( !empty($view_folder) && is_dir(APPPATH.$view_folder.'/'))
        {
            $view_folder = APPPATH.$view_folder;
        }
        elseif ( !is_dir(APPPATH.'views/'))
        {
            header('HTTP/1.1 503 服务不可用。', TRUE, 503);
            exit('您的视图文件夹路径似乎设置不正确。请打开以下文件并更正:'.SELF);
        }
        别的
        {
            $view_folder = APPPATH.'views';
        }
    }

    if (($_temp = realpath($view_folder)) !== FALSE)
    {
        $view_folder = realpath($view_folder).'/';
    }
    别的
    {
        $view_folder = rtrim($view_folder, '/').'/';
    }

    定义('VIEWPATH',$view_folder);

您不应该依赖.htaccess,您可能会遇到mod_rewrite不可用的环境的问题。

此外,不要views/从超链接加载目录中的文件。将所有这些对页面的请求从 index.php 路由到您的controllers/.,然后使用这些类来加载文件。再次仔细查看 CodeIgniter 的源代码以获取想法。

于 2012-12-16T17:57:36.497 回答