0

我有 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)

任何帮助或启蒙都将被最亲切地接受!

4

2 回答 2

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] 
于 2013-01-18T19:10:32.830 回答
0

您需要匹配 RewriteCond 中的查询字符串,然后从规则中反向引用该 RewriteCond。RewriteRule 只匹配路径,而不是查询字符串。

这是我之前回答过类似请求的相关帖子:Mod_rewrite rewrite example.com/page.php?v1=abc&v2=def to example.com/abc/def

于 2013-01-18T19:08:07.873 回答