#Assuming the correct RewriteBase is used...
#Redirect the client to the fancy url
RewriteCond %{QUERY_STRING} ^url=(.*)$
RewriteRule ^product_detail\.php$ %1? [R,L]
#Rewrite the url internally and stop rewriting
#to prevent a loop
RewriteRule ^(.*)$ product_detail.php?url=$1 [END]
在此代码中,您首先将客户端重定向到您希望在地址栏中显示的 url。%1
匹配 RewriteCond 的第一个捕获组。尾随?
清除查询字符串。第二条规则在内部重写 url,以便服务器可以实际生成输出而不是 404 错误。END 标志(可从 apache 2.3.9 及更高版本获得;文档)将完全停止重写 url)。这是为了防止 url 不断被重写的永无止境的循环。(文档)
编辑: 2.3.9 以下的 apache 版本没有 END 标志。为了防止循环,您需要解决这个问题。您可以使用例如:
#Assuming the correct RewriteBase is used...
#Redirect the client to the fancy url
RewriteCond %{QUERY_STRING} !redirect=true
RewriteCond %{QUERY_STRING} ^url=(.*)$
RewriteRule ^product_detail\.php$ %1? [R,L]
#Rewrite the url internally and stop rewriting
#to prevent a loop
RewriteRule ^(.*)$ product_detail.php?url=$1&redirect=true [L]