您似乎误解了 rewrite 模块(特别是您的规则)的实际作用。
当您浏览到:
localhost/abc/product.php?id=23
RewriteRule 没有被调用,也不应该做任何事情。这里没有问题,你只是浏览到了错误的URL
网址转换
http://www.yoursite.com/product/123 <- URL that user goes to
http://www.yoursite.com/product.php?id=123 <- Rewritten URL that the server sees
RewriteRule(s) 解释
重写规则分为三个部分(不包括RewriteRule
部分...)
- 它与 url 匹配的正则表达式
- 它转换成的 url
- 其他选项
鉴于您的规则:
RewriteRule ^product/([^/.]+)/?$ product.php?id=$1 [L]
正则表达式是:^product/([^/.]+)/?$
新网址:product.php?id=$1
选项:[L]
这意味着用户浏览到不错的url http://www.yoursite.com/product/123
(并且您的所有链接都指向不错的URL),然后服务器与正则表达式匹配并将其转换为只有服务器才能看到的新 URL 。
实际上,这意味着您有两个指向同一个页面的 URL……好的URL 和不好的URL 都会将您带到同一个地方。不同之处在于,不好看/标准的 URL 对公众和其他追求您的网站的人是隐藏的。
正则表达式
没有被重定向的原因http://mysite.com/product/image.jpg
是因为您在RewriteRule
.
解释
^product/([^/.]+)/?$
^
=> 字符串开始
product/
=> 匹配文字字符串product/
([^/.]+)
=> 一个匹配一个或多个字符的捕获组,直到下一个/
或.
/?$
=> 匹配一个可选/
的,后跟字符串的结尾
给定网址:
http://mysite.com/product/image.jpg
您的正则表达式匹配product/image
但随后遇到.
停止匹配...由于这不是字符串的结尾,$
因此规则无效,因此转换永远不会发生。
您可以通过将您的字符类更改[^/.]
为 just[^/]
或 - 我的首选方法 - 删除字符类并简单地使用来解决此问题.+
(无论如何,您都可以将所有内容捕获到字符串的末尾
RewriteRule ^product/([^/]+)/?$ product.php?id=$1 [L]
RewriteRule ^product/(.+)/?$ product.php?id=$1 [L]