.htaccess Url重写规则导致404错误

.htaccess Url重写规则导致404错误,.htaccess,mod-rewrite,url-rewriting,clean-urls,.htaccess,Mod Rewrite,Url Rewriting,Clean Urls,我有这个网址 http://www.mysite.com/product.php?name=Ball&id=25672 我想让它看起来像这样 http://www.mysite.com/product/Ball-25672/ 我使用这个.htaccess文件 Options +FollowSymLinks RewriteEngine on RewriteCond %{QUERY_STRING} ^name=(.*)&id=(.*) RewriteRule ^product\.

我有这个网址

http://www.mysite.com/product.php?name=Ball&id=25672
我想让它看起来像这样

http://www.mysite.com/product/Ball-25672/
我使用这个.htaccess文件

Options +FollowSymLinks
RewriteEngine on
RewriteCond %{QUERY_STRING} ^name=(.*)&id=(.*)
RewriteRule ^product\.php$ /product/%1-%2/? [L,R=301]
我有两个问题:

1) 当我将鼠标指针滚动到球项目上时,浏览器上显示的链接是第一个,但我希望它显示第二个

2) 当我点击url时,我得到404错误,但浏览器上显示的链接是正确的。

首先:

当我将鼠标指针滚动到球项目上时,浏览器上显示的链接是第一个,但我希望它显示第二个

重写引擎不会更改站点的实际内容。它仅更改浏览器发送到服务器的请求URI。让链接看起来像
http://www.mysite.com/product/Ball-25672/
并且完全超出了mod_重写的能力

第二:

当我点击url时,我得到404错误,但是浏览器上显示的链接是正确的

您正在将浏览器重定向到外观更好的URL:
http://www.mysite.com/product/Ball-25672/
。然后浏览器会看到这个新的URL,并从服务器请求它。因此,服务器看到
/product/Ball-25672/
并尝试提供它,但它不存在,因此您得到404。这里需要两套规则,一套从外部将浏览器重定向到外观更好的URL,另一套从内部将外观更好的URL重写回内容实际所在的位置:


“当我将鼠标指针滚动到球项目上时,它在浏览器上显示的链接是第一个,但我希望它显示第二个”–然后您必须将第二个链接写入HTML…mod_rewrite只能重定向您的链接,它无法更改您页面的内容。@CBroe:product.php文件将如何处理此链接?在您内部重写后会这样做……请查看mod_rewrite是如何工作的,您似乎不知道。@CBroe我读了很多关于它的书,并尝试了许多示例和工具,但大多数都可能已经过时,我想我在问一些很简单的问题,但我没有得到答案。
Options +FollowSymLinks -Multiviews
RewriteEngine on

RewriteCond %{THE_REQUEST} ^(GET|HEAD)\ /+product\.php\?name=([^&]+)&id=([0-9]+)
RewriteRule ^ /product/%2-%3/? [L,R=301]

RewriteRule ^product/(.+)-([0-9]+)/?$ /product.php?name=$1&id=$2 [L]