基于GET参数的URL重定向

时间:2014-12-28 11:59:17

标签: .htaccess mod-rewrite redirect url-rewriting

我想在我的网站上制作更好的网址。

目前,单个产品页面采用以下形式:

www.mywebsite.com/details.php?id=1

我希望那些更像

www.mywebsite.com/name-of-the-product?id=1

其中id = 1是可更改的,它将是特定产品的id。

所以我想将所有新链接重定向到名为details.php的旧页面,并将id传递给它。

我搜索了一些答案,但所有这些都是预定义的和特定的GET参数,我希望这对于网站上的所有产品都更为通用。

更新

谢谢大家的帮助!看起来我误导了你。我在网站上有很多页面。而且我想仅为这一个改变路线(单个产品页面,以便那些特定路线看起来更好)。 现在,只有@samurai的答案会重定向,但它也会重定向每个其他页面。这就是为什么我想添加一些特定的GET参数(或类似的东西),告诉.htaccess'嘿,只将这样的页面重定向到details.php'。 有可能这样做吗?

3 个答案:

答案 0 :(得分:1)

为什么在显示产品名称时将ID保留在url中? 无论如何,你可以做的是从数据库中获取产品名称,基于提供的id,头页到所需的URL并添加一些.htaccess魔法

UPD:让我们以Nike Air Max为例。用户尝试访问下一个网址:www.mywebsite.com/?id=1,而在您的数据库中,Air Maxes与id = 1相关联。一页你的PHP页面的代码:

$id = intval( $_GET['id'], 10 );
$product_name = mysqli_fetch_assoc(mysqli_query($con, "SELECT item_name FROM products WHERE id = $id"));
$altered_name = str_replace(' ', '-', $product_name);
header('Location: /?id=1&product_name='.$altered_name);

现在有些.htaccess魔法

RewriteRule ^product/([^/]*)$ /?id=1&product_name=$1 [L]

因此,网址将为www.website.com/product/nike-air-maxes

答案 1 :(得分:1)

内部重写看起来像这样:

RewriteRule ^(?!details\.php)[^/]+/?$ details.php [L]

查询字符串自动转移。 (?details\.php)部分是负面预测。它阻止了details.php匹配此规则,因为这会导致无限循环。请注意,您应该:

  • 如果提供了id,请检入details.php。如果没有提供,你应该使用database-magic来获取这个id,然后在php中重定向客户端

    if( empty( $_GET['id'] ) ) {
      $id = getIdByName( $name );
      header( "Location: {$name}?id={$id}", 301 );
      exit();
    }
    
  • 检查是否未直接请求details.php。您无法在.htaccess中轻松召唤产品名称,因此您需要在PHP脚本中执行此操作

    if( empty( $name ) || $name == "details.php" ) {
      $name = getNameById( $id );
      header( "Location: {$name}?id={$id}", 301 );
      exit();
    }
    

答案 2 :(得分:0)

创建.htaccess文件并将这些行放入其中:

RewriteEngine on
# URL rewriting rules
RewriteRule ^([_a-zA-Z0-9-]+)/([0-9]+)$ details.php?id=$2 [L,E]

,您的网址应为:www.mywebsite.com/name-of-the-product/1

RewriteRule ^([_a-zA-Z0-9-]+)?$ details.php [L,E]

有这样的网址:www.mywebsite.com/name-of-the-product?id=1