Php 如何设计使用URI选择内容的文档/内容应用程序

Php 如何设计使用URI选择内容的文档/内容应用程序,php,web-applications,apache2,apache,Php,Web Applications,Apache2,Apache,我试图弄清楚如何设计一个在目录结构中包含文档(html格式)/内容的应用程序。我想要的是,URL应该决定应该显示哪个文档。例如,www.mydomain.com/docs/read_这应该在某种程度上帮助我呈现名为“read_this”的内容 我还希望用户能够对文档进行全面搜索。首先,我打算将所有文档存储在MySQL中,并为用户提供内置的完整搜索支持。但是我陷入了如何解决URI与内容的问题。由于应该可以创建或编辑内容,我认为将其存储在数据库中比将其放入文件中更容易 这是正常的做法,很多网站都是这

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

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

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

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


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

您几乎要创建一个REST接口,但由于您希望直接为文档提供服务,因此并不完全是这样

我建议采用如下结构:

  • http://example.com/docs/
    :应用程序的根级别(显示有关应用程序的一些信息)
  • http://example.com/docs/view/read_this
    :显示名为“read\u this”的文档
  • http://example.com/docs/search/keyword
    :显示包含关键字“keyword”的文档列表
添加“查看”和“搜索”父文件夹可防止冲突;如果您刚刚有
http://example.com/docs/read_this
作为文档视图模式(保留搜索模式不变),您永远不可能拥有名为
search
的文档,因为这会与特殊的
search
术语相冲突。您还提到了编辑,可以使用
http://example.com/edit/read_this
schema

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

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

.htaccess: 它位于
文档
文件夹的根目录中,与
index.php
一起:

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

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


例如,如果您使用apache,并且只希望对格式为
www.mydomain.com/docs/read\u this
的URI进行这种映射,那么您可以在docs文件夹中有一个
.htaccess
,它将所有请求重定向(通过)到一个php脚本(如docs/index.php),然后可以解析
$\u服务器['REQUEST_URI']
变量以获取URI中的文档名(
读取此
)然后从mysql数据库请求适当的文档。

谢谢!好吧,重写是解决这个问题的常用方法吗?您是否认为在重写时应该使用URI的查看、搜索和编辑部分,以便指向适当的php文件?通常的做法是将所有内容重定向到单个php文件,并使php文件然后确定如何处理输入。我添加了一个示例,不仅重定向
视图
搜索
,而且重定向所有其他小写关键字。如果操作关键字未知,PHP可以创建一个优美的错误页。Greate,我将查看它并返回这里。我决定在httpd.conf中配置重写,因为我不需要分发应用程序,显然它的性能也更好。但是,我的重写规则有问题。有什么建议吗?重写规则^docs/([a-z]+)/([a-Za-z0-9_-]+)/?$http://%{http_HOST}/docs/index.php?action=$1和target=$2[QSA,L]您的重写规则@MidnightLightning中出现了一些错误。您可以在此处阅读。我没有提到我的设置是多虚拟hos,这可能是一些问题的原因。谢谢!这听起来有些问题。您在httpd.conf中是否看到任何负面的操作(重定向所有URI=/docs/…)?不确定我是否有资格回答这个问题,当我的站点迁移到nginx时,我才刚刚开始学习apache,所以我对apache的知识有限。也就是说,.htaccess是处理特定目录的最后一搏,我使用它是因为我只能访问站点上的“个人”目录。我会假设在更高级别上处理它更好。好吧,我想你是对的。我明天会试试。我一试就回来。将配置放在
httpd.conf
中会降低应用程序的可移植性;如果你想复制/移动应用程序到另一台服务器,你不仅要记住从
/docs/
中移动PHP文件,b我们还要记住,
httpd.conf
的一部分对该项目是有效的。如果您只是在
docs
文件夹中使用一个
.htaccess
文件,那么所有项目文件都在该文件夹中,以便于备份/复制。在nginx中,您可以将特定于站点的内容放入其自己的文件,然后将其导入主配置文件,您可以吗o是否与httpd.conf类似?
<?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;
}
?>