1

我认为我的问题很简单,但在过去的几个小时里,我一直在用头撞墙。

我的网站使用 rewriterule 来确保带有 php 变量的杂乱路径名现在很好而且整洁(我已经从我的示例中删除了 [http://www],因为系统认为我正在放置链接并且不会让我)。

因此,有人在 mysite.co.uk/my-product-P1.html 访问我的网站,该网站会知道将 mysite.co.uk/product.php?id=1 发布到服务器。

但我也想反过来整理一下。如果旧客户或旧链接使用路径名 mysite.co.uk/product.php?id=1 那么我希望它返回 mysite.co.uk/my-product-P1.html 代替,即使旧路径名将实际上仍然有效。我不希望客户从不同的路径名访问同一页面。

我该怎么做,它会创建一个循环吗?在另一个网站上,我使用它工作:

RewriteCond %{QUERY_STRING} ^id=1$ [NC]
RewriteRule ^product\.php$ product-P1.html? [R=301,L]

但是在那个网站上只有大约 10 种产品,所以我可以为每种产品编写这些行。在我的另一个网站上,我有数百种产品,所以这不实用,我需要自动完成。

希望这是有道理的。我已经阅读了其他帖子并且找不到我的解决方案,如果在其他地方清楚地解释了这一点,我深表歉意。

4

2 回答 2

1

我该怎么做,它会创建一个循环吗?

您拥有的规则(在有 10 种产品的网站上)需要与实际请求相匹配,而不是 URI:

RewriteCond %{THE_REQUEST} \ /product\.php\?id=([^\ &]+)
RewriteRule ^ /product-P%1.html? [R=301,L]

但是最好在 php 脚本中执行此操作,而不是枚举 htaccess 文件中的所有产品:

在我的另一个网站上,我有数百种产品,所以这不实用,我需要自动完成

你不能只使用 mod_rewrite 来做到这一点。您需要在脚本中product.php编写脚本。该product.php脚本将需要检查$_SERVER'[REQUEST_URI']php 变量,并查看它是否以: 开头/product.php

如果是这样,那么您知道有人直接访问了 php 脚本,您需要使用传入的 id 获取产品名称$_GET['id'],然后重定向到产品名称 + "-P$_GET['id'].html"

htaccess 文件和 mod_rewrite 不知道产品 ID 和产品名称之间的映射,因此您需要在 php 脚本中执行此操作(它确实可以访问此映射)。

于 2013-10-16T15:08:53.970 回答
0

You need this additional rule:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+product\.php\?id=([^\s&]+) [NC]
RewriteRule ^ /product-P%1.html? [R=302,L]
于 2013-10-16T15:07:45.683 回答