"动态"用mod_rewrite和apache重写

时间:2014-08-29 22:29:46

标签: php apache .htaccess mod-rewrite curl

我为商店创建一个不错的mod_rewrite解决方案有点“战略性”问题。该商店有不同类型的页面

  • 产品(products.php)
  • 类别(category.php)
  • 内容(content.php)

所以“默认”URI看起来像这样

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

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

  • / chocholate-icecream - > 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加载内容并将其显示给用户

基本上我认为这是个好主意,但会话处理,发布数据,基于php的重定向(标题:...)与CURL有很多问题,我真的打算以这种方式取消等等。< / p>

所以我的问题是: 你有没有一个想法或模式可以帮助我创建“漂亮的”URI而不使用复杂的CURL映射器?

提前多多感谢, 麦克

更新为“包含解决方案”:

“包含问题”的一个很好的例子: 请求www.shop.com/cart将“重写”为“mapper.php”。 “mapper.php”决定包括www.shop.com/shoppingcart.php。

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

在“普通/直接”调用中,$ _SERVER ['PHP_SELF']将为“/shopping_cart.php”,它将显示全屏版本。使用include选项查看mapper.php会给我们$ _SERVER ['PHP_SELF'] =='/ mapper.php'这将给我们带有列的视图(错误)。

2 个答案:

答案 0 :(得分:0)

你可以简单地将它们全部指向一个页面,然后根据slug包含正确的脚本。例如,重写所有请求,如index.php?slug = chocolate-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 / chocolate-icrecream那样构建你的网址。那将是良好的语义命名,现在在互联网上相当一致。

答案 1 :(得分:0)

你想要做的事情太复杂了,为什么不给每个文件提供一个URI,比如

  • 产品/ chocholate-icecream - &gt; product.php?蛞蝓= chocholate-冰淇淋
  • category / coffe-and-ice - &gt; category.php?蛞蝓=咖啡和冰
  • 内容/印记 - &gt; content.php?蛞蝓=压印

您可以使用产品,类别或内容的id,而不是使用slug

htaccess就像

RewriteEngine on

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]

RewriteRule ^product/(.*)$ products.php?slug=$1 [L]
RewriteRule ^category/(.*)$ category.php?slug=$1 [L]
RewriteRule ^content/(.*)$ content.php?slug=$1 [L]