我让mod_rewrite在开发环境中工作 此测试域在.htaccess文件中使用这些规则:
Options +FollowSymLinks
Options +Indexes
RewriteEngine on
# deal with potential pre-rewrite spidered / bookmarked urls
RewriteRule ^clothes/index.php?pg=([0-9]+)$ /clothes/index$1.php [R=301,L]
# deal with actual urls
RewriteRule ^clothes/[0-9a-z-]+-pr([0-9]+).php$ /clothes/product.php?pid=$1 [L]
第二条规则正常工作。输入http://testdomain.dev/clothes/shirt-pr32.php即可从http://testdomain.dev/clothes/product.php静默传送内容?pid = 32 ......这是所期望的和预期的!
但是,假设这个应用于一个最初使用路径的实时站点,例如:http://testdomain.dev/clothes/product.php?pid = 32,我想重定向任何传入的请求遵循旧模式到新网址......这是第一条规则的目的。
我的问题是我的测试服务器似乎忽略了第一条规则并按要求提供了页面(页面加载但地址栏保留在http://testdomain.dev/clothes/product.php? PID = 32)
任何援助或启示都会得到最优惠的接受!
答案 0 :(得分:0)
您需要匹配RewriteCond中的查询字符串,然后从规则反向引用RewriteCond。 RewriteRule仅匹配路径,而不是查询字符串。
以下是我之前使用类似请求回复的相关帖子:Mod_rewrite rewrite example.com/page.php?v1=abc&v2=def to example.com/abc/def
答案 1 :(得分:0)
您无法在重写规则中与查询字符串匹配,您需要在条件中使用`%{QUERY_STRING}变量,并使用%来进行后退分组。所以而不是:
RewriteRule ^clothes/index.php?pg=([0-9]+)$ /clothes/index$1.php [R=301,L]
你需要:
RewriteCond %{QUERY_STRING} ^pg=([0-9]+)
RewriteRule ^clothes/index.php$ /clothes/index%1.php? [R=301,L]