网址重写规则会导致404错误

时间:2013-11-12 12:56:59

标签: .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\.php$ /product/%1-%2/? [L,R=301]

我有两个问题:

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

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

1 个答案:

答案 0 :(得分:1)

首先:

  

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

重写引擎不会更改您网站的实际内容。它仅将浏览器发送的请求URI更改为服务器。由你决定使你的链接看起来像http://www.mysite.com/product/Ball-25672/并且完全超出了mod_rewrite的能力。

第二

  

当我点击网址时,我收到404错误,但浏览器上显示的链接是正确的。

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

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]
相关问题