";“动态”;使用mod_rewrite和apache进行重写


"Dynamic" rewrite with mod_rewrite and apache

我在为商店创建一个漂亮的mod_rewrite解决方案时遇到了一个"战略"问题。商店有不同类型的页面:

  • 产品(Products.php)
  • 类别(category.php)
  • 内容(Content.php)

因此"默认"URI如下所示

  • /products.php?id=2
  • /category.php?id=4
  • /content.php?id=5

最终结果应该是包含页面名称(产品名称、类别名称)的URI。

  • /巧克力冰淇淋->product.php?id=2
  • /coffe and ice->category.php?id=4
  • /imprint->content.php?id=5

我现在的问题是,我有不同类型的内容,这些内容映射到不同的.php文件。我无法确定用mod_rewrite路由到哪个.php文件,只要我不使用欺骗"比如**/product/**chocolate icrecream",这样我就知道这个URI是为产品创建的。但我和我的客户都不想要这种解决方案。

我已经开始了另一次尝试:

  • 所有与物理文件或文件夹不匹配的请求都被路由到mapper.php文件。这个文件在数据库中查找——我有一个所有产品、类别等的索引——并给我正确的文件
  • 映射程序然后通过CURL加载内容并将其显示给用户

基本上,我认为这是一个好主意,但在CURL的会话处理、发布数据、基于php的重定向(标题:…)方面有很多问题,我真的计划取消这种方式等等。

所以我的问题是:你们中有人有什么想法或模式可以帮助我在不使用复杂的CURL映射器的情况下创建"好看"的URI吗?

提前感谢,Mike

更新为"包含解决方案":

"包含问题"的一个很好的例子:对www.shop.com.cart的请求被"重写"为"mapper.php"。"mapperphp"决定包含www.shop.comshoppingcart.hp.

shoppingcart.php使用smarty来显示购物车。如果实际调用的文件是"shoppingcart.php",则该视图会询问$_SERVER变量,以决定页面应该以全屏模式显示还是带有其他列。

在"正常/直接"调用中,$_SERVER['HP_SELF']将为"/shopping_cart.PHP",它将显示全屏版本。使用include选项浏览mapper.php会给我们$_SERVER['HP_SELF']=='/mapper.php',这会给我们一个带列的视图(怎么了)。

您可以简单地将它们全部指向一个页面,然后包含基于slug的正确脚本。例如,重写像index.php这样的所有请求?slug=巧克力icrecream。

index.php

$resource = fetch_resource($slug);
if ($resource->slug == 'product') 
{
  include('products.php');
}
else if ($resource->type == 'category')
{
  include('category.php');
}
else
{
  include('content.php');
}

我不明白你为什么不想像/product/cochocolateicrecream那样构建你的URL。这将是一个很好的语义命名,在当今互联网上相当一致。