我想在我的网站上制作更好的网址。
目前,单个产品页面采用以下形式:
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'。 有可能这样做吗?
答案 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