【问题标题】:How to design document/content application where URI should be used for selecting content如何设计应该使用 URI 来选择内容的文档/内容应用程序
【发布时间】:2012-09-13 13:12:47
【问题描述】:

我试图弄清楚如何设计一个在目录结构中包含文档(html 格式)/内容的应用程序。我想要的是 URL 应该决定应该呈现哪个文档。例如。 www.mydomain.com/docs/read_this 应该以某种方式帮助我展示名为“read_this”的内容。

我还希望用户能够全面搜索文档。首先,我打算将所有文档存储在 MySQL 中,并使用内置的完整搜索支持。但我陷入了如何解决 URI 与内容的问题。由于应该可以创建或编辑内容,我认为将其存储在数据库中会比将其放入文件更容易。

这是正常的做法,很多网站都是这样实现的。不过,我找不到任何关于如何解决它的信息。也许用于谷歌搜索的词与其他信息相似;文档、目录、结构、内容、URI等……

我在 CentOS 6.2 上使用 Apache/httpd 和 PHP。

解决上述问题的方法是什么?

【问题讨论】:

    标签: php web-applications apache2 apache


    【解决方案1】:

    您几乎是在创建一个 REST 接口,但由于您想直接提供文档,所以还不完全。

    我建议这样的结构:

    • http://example.com/docs/:应用程序的根级别(显示有关应用程序的一些信息
    • http://example.com/docs/view/read_this:显示名为“read_this”的文档
    • http://example.com/docs/search/keyword:显示包含关键字“keyword”的文档列表

    添加“视图”和“搜索”父“文件夹”可防止冲突;如果您只是将 http://example.com/docs/read_this 作为文档视图架构(并保留搜索架构原样),那么您将永远不会拥有名为 search 的文档,因为这会与特殊的 search 术语冲突。您还提到了编辑,这可以通过 http://example.com/edit/read_this 架构完成。

    为了解析所有这些 URI,您需要在 Apache 配置中使用 Mod_Rewrite 将它们指向您的 PHP 脚本。

    编辑:这是需要的.htaccess 和 PHP 链接

    .htaccess:

    这位于您的 docs 文件夹的根目录中,与 index.php 一起:

    <IfModule mod_rewrite.c>
      RewriteEngine On
      RewriteRule ^([a-z]+)/([A-Za-z0-9_-]+)/?$ index.php?action=$1&target=$2 [QSA,L]
    </IfModule>
    

    这在技术上意味着人们可以输入 URL http://example.com/docs/view/read_thishttp://example.com/docs/index.php?action=view&amp;target=read_this 并获得相同的结果

    index.php:

    <?php
    $action = (isset($_GET['action']) && $_GET['action'] != '')? $_GET['action'] : false;
    $target = (isset($_GET['target']) && $_GET['target'] != '')? $_GET['target'] : false;
    switch($action) {
      case 'view':
        viewDoc($target); // Do your view logic here
        break;
      case 'search':
        doSearch($target); // Do your search logic here
        break;
      case 'foobar':
        // Add new functionality here
        break;
      default:
        errorOut('No such action as '.$action);
        break;
    }
    ?>
    

    【讨论】:

    • 谢谢!好的,所以重写是常见的解决方案?您是否认为在重写时应该使用 URI 的查看、搜索和编辑部分以指向适当的 php 文件?
    • 通常的做法是将所有内容重定向到单个 PHP 文件,然后让 PHP 文件确定如何处理输入。我添加了一个示例,它不仅重定向viewsearch,还重定向所有其他小写关键字。如果 action 关键字未知,PHP 可以创建优雅的错误页面。
    • 太好了,我会调查一下然后回到这里。
    • 我决定在 httpd.conf 中配置重写,因为我不需要分发应用程序,而且显然它的性能也更好。但是,我的重写规则有问题。有什么建议么? RewriteRule ^docs/([a-z]+)/([A-Za-z0-9_-]+)/?$ http://%{HTTP_HOST}/docs/index.php?action=$1&target=$2 [QSA ,L]
    • 您的重写规则@MidnightLightning 中有一些错误。你可以在这里阅读RewriteRule question我没有提到我的设置是多虚拟主机,这可能是一些问题的原因。
    【解决方案2】:

    您所描述的通常称为 RESTful URI。有太多方法可以实现这一点,不能说“这是正确的方法”。

    例如,如果您使用 apache,并且您只希望为 www.mydomain.com/docs/read_this 形式的 URI 发生这种映射,那么您可以在 docs 文件夹中有一个 .htaccess 重定向(通过 mod_rewrite)所有请求到单个 php 脚本(如 docs/index.php),然后可以剖析 $_SERVER['REQUEST_URI'] 变量以获取 URI 中的文档名称(read_this),然后从您的 mysql DB 请求适当的文档。

    【讨论】:

    • 谢谢!这听起来像是什么。你能在 httpd.conf 中看到任何负面的东西吗(重定向所有 URI = /docs/...)?
    • 不确定我是否有资格回答这个问题,当我的网站迁移到 nginx 时,我才刚刚开始学习 apache,所以我对 apache 的了解有限。也就是说,.htaccess 是处理特定目录的最后努力,我使用它是因为我只能访问网站上的“个人”目录。我认为在更高级别处理它会更好。
    • 好吧,我认为你是对的。我会试试……明天。试用后我会回来的。
    • 将配置放入您的httpd.conf 会降低应用程序的可移植性;如果您想将应用程序复制/移动到另一台服务器,您不仅要记住将 PHP 文件从 /docs/ 移动,还要记住 httpd.confpart 对此有效项目。如果您只是在docs 文件夹中使用.htaccess 文件,则所有项目文件都在该文件夹中,以便于备份/复制。
    • 在 nginx 中,您可以将站点特定的内容放入其自己的文件中,然后将其导入主配置文件,您可以使用 httpd.conf 做类似的事情吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2021-06-22
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多