我想我的问题很简单,但在过去的几个小时里,我一直把头撞在墙上。
我的网站使用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个产品,所以我可以为每个产品写这些行。在我的另一个网站,我有数百种产品,所以这是不切实际的,我需要自动完成它。
希望这是有意义的。我已经阅读了其他的文章,并没有找到我的解决方案,所以道歉,如果这是清楚地解释了其他地方。
发布于 2013-10-16 15:08:53
我如何做到这一点,它会创建一个循环吗?
您拥有的规则(在站点上有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脚本,您需要使用$_GET['id']中传递的id获取产品名,然后重定向到产品名+ "-P$_GET['id'].html"。
htaccess文件和mod_rewrite不知道产品ID和产品名称之间的映射,因此您需要在php脚本(它确实可以访问此映射)中这样做。
发布于 2013-10-16 15:07:45
您需要这条附加规则:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+product\.php\?id=([^\s&]+) [NC]
RewriteRule ^ /product-P%1.html? [R=302,L]https://stackoverflow.com/questions/19406944
复制相似问题