【问题标题】:"Dynamic" rewrite with mod_rewrite and apache使用 mod_rewrite 和 apache 进行“动态”重写
【发布时间】:2014-08-29 22:29:45
【问题描述】:

在为商店创建一个不错的 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
  • /印记-> content.php?id=5

我现在的问题是,我有不同类型的内容,它们映射到不同的 .php 文件。而且我无法确定要使用 mod_rewrite 路由到哪个 .php 文件,只要我不使用“像 **/product/**chocolate-icrecream”这样的作弊,这样我就知道这个 URI 是为产品。但我和我的客户不想要那个解决方案。

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

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

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

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

提前非常感谢, 迈克

更新到“包括解决方案”:

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

shoppingcart.php 使用 smarty 来显示购物车。视图询问 $_SERVER 变量,如果实际调用的文件是“shoppingcart.php”来决定页面是否应该以全屏模式显示或附加列。

在“正常/直接”调用中,$_SERVER['PHP_SELF'] 将是“/shopping_cart.php”,它将显示全屏版本。使用 include 选项检查 mapper.php 将为我们提供 $_SERVER['PHP_SELF']=='/mapper.php' ,这将为我们提供带有列的视图(出了什么问题)。

【问题讨论】:

    标签: php apache .htaccess mod-rewrite curl


    【解决方案1】:

    您只需将它们全部指向一个页面,然后包含基于 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 这样构建您的网址。这将是当今互联网上相当一致的良好语义命名。

    【讨论】:

    • 经典的包含目前不起作用,因为页面使用了多个框架(Smarty 等),例如要求调用的 URL 来决定如何显示内容。如果它是一个不起作用的包含。这就是为什么我尝试使用 CURL 解决它的原因,这也会导致会话、cookie 和其他 HTTP 标头内容出现大量问题......因此,我正在寻找一个更“优雅”的解决方案——比如RewriteMap(实际上我不能使用,因为我的客户只能访问 .htaccess 而不能访问 Apache vhost 配置)。
    • 我在上面的问题中添加了一个更新,它解释了包含问题。
    猜你喜欢
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多