代码之家  ›  专栏  ›  技术社区  ›  ArabianMaiden

如何从“example.com/products/123/title of this product”这样的干净url获取['id']?

  •  1
  • ArabianMaiden  · 技术社区  · 2 年前

    我希望我的URL如下所示:

    example.com/products/123/title-of-this-product
    

    实际的URL是:

    example.com/products.php?id=123&title=title-of-this-product
    

    这个 .htaccess 文件正确地解释了我的URL,因此在此页面上的用户只能看到干净的URL。然而,如果我尝试使用 $_GET['id'] products.php page,脚本崩溃,因为它无法识别任何 id 在URL中。

    .htaccess 代码:

    Options +FollowSymLinks +MultiViews
    
    RewriteEngine On
    RewriteRule ^([0-9]+)(?:/([^/]*))?/?$ ./products.php?id=$1&title=$2 [L,NC]
    

    产品。php 代码:

    $product_id = isset($_GET['id']) ? $_GET['id'] : "Error! I can't find your product!";
    

    如果我想要一个干净的URL,如何保留PHP函数的URL参数?

    1 回复  |  直到 2 年前
        1
  •  1
  •   MrWhite    2 年前

    你实际上有两个问题。。。

    1. MultiViews (mod_协商的一部分)被启用,正是这个服务 products.php .
    2. 你的 RewriteRule 图案 不正确,与请求的URL不匹配。
    Options +FollowSymLinks +MultiViews
    

    你需要禁用 多视图 (您已经明确启用了它)。正是多视图(mod_协商的一部分)服务于您的客户 产品。php 文件(没有任何URL参数),而不是后面的mod_rewrite指令。多视图本质上允许无扩展的URL,只需很少的努力,但是,它可能会导致意外的冲突(使用mod_rewrite)——如本例所示。

    你的 重写规则 指令实际上什么都没做。如果 .htaccess 文件位于文档根目录中,然后 重写规则 图案 ^([0-9]+)(?:/([^/]*))?/?$ 与请求的URL不匹配( /products/123/title-of-this-product ),因此该指令实际上根本没有被处理(尽管多视图仍然会覆盖该指令,即使它被处理)。

    试着这样做:

    # Disable MultiViews
    Options +FollowSymLinks -MultiViews
    
    RewriteEngine On
    RewriteRule ^products/([0-9]+)(?:/([^/]*))?/?$ products.php?id=$1&title=$2 [L,NC]
    

    你失踪了 products 从与 重写规则 图案 没有 products/ 在正则表达式开始时,它只会在您处于 /products/ 子目录,即。 /products/.htaccess 这个 重写规则 指令与 .htaccess 文件本身。