我试图弄清楚如何设计一个在目录结构中包含文档(以html格式)/内容的应用程序。我想要的是URL应该决定应该呈现哪个文档。例如。 www.mydomain.com/docs/read_this应该以某种方式帮助我呈现名为“read_this”的内容。
我还希望用户可以对文档进行全面搜索。首先,我的目的是将所有文档存储在MySQL中,并使用内置的全搜索支持。但我陷入了如何解决URI与内容问题的困境。由于应该可以创建或编辑内容,但是将其存储在数据库中会比将其放入文件更容易。
这是正常的做法,许多网站都是这样实现的。不过,我找不到任何关于如何解决它的问题。也许用于谷歌搜索的词语与其他信息类似;文档,目录,结构,内容,URI等......
我在CentOS 6.2上使用Apache / httpd和PHP。
解决上述问题的方法是什么?
答案 0 :(得分:1)
您几乎创建了一个REST界面,但由于您希望直接提供文档,因此并不完全。
我建议的结构如下:
http://example.com/docs/
:应用程序的根级别(显示有关应用程序的一些信息)http://example.com/docs/view/read_this
:显示名为" read_this" http://example.com/docs/search/keyword
:显示包含关键字"关键字" 添加"视图"和"搜索"父母"文件夹"防止碰撞;如果您只有http://example.com/docs/read_this
作为文档视图架构(并按原样保留搜索架构),则您永远不会有一个名为search
的文档,因为它会与特殊的search
术语发生冲突。您还提到了编辑,可以使用http://example.com/edit/read_this
架构完成。
为了解决所有这些URI问题,您需要在Apache配置中使用Mod_Rewrite将它们指向PHP脚本。
编辑:这里需要.htaccess
和PHP链接
这是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>
这在技术上意味着人们可以输入网址http://example.com/docs/view/read_this
或http://example.com/docs/index.php?action=view&target=read_this
并获得相同的结果
<?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;
}
?>
答案 1 :(得分:1)
您所描述的内容通常称为RESTful URI。有太多方法可以实现这一点,说“这是正确的方法”。
例如,如果您使用apache并且只希望对www.mydomain.com/docs/read_this
格式的URI进行此类映射,那么您可以在docs文件夹中重定向.htaccess
(通过{{ 3}})对单个php脚本(如docs / index.php)的所有请求,然后可以解析$_SERVER['REQUEST_URI']
变量以获取URI(read_this
)中的文档名称,然后请求来自mysql DB的相应文档。