mod_alias 中的RedirectMatch
指令与查询字符串不匹配,仅匹配/index.html
部分。您需要使用 aRewriteCond ${QUERY_STRING} <regexp>
来匹配它。但是如果你像这样重定向,你将导致一个循环,因为 URI 会通过重写引擎,直到 URI 不变:
- 用户在其 URL 地址栏中键入http://example.com/index.html?album=rockstar
- 浏览器被重定向到http://example.com/songs/album/rockstar.html
- mod rewrite 看到
/songs/album/rockstar.html
并将其重写为/index.html?album=rockstar
- 重定向规则成功匹配
/index.html?album=rockstar
- 从第 2 步开始重复。
您需要确保仅在实际请求是 for 时才重定向/index.html?album=rockstar
,而不是在通过重写引擎时重定向:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.html\?album=(.+)\ HTTP
RewriteRule ^index\.html$ http://example.com/songs/album/%1.html? [R=301,L]
%{THE_REQUEST}是实际的 HTTP 请求,而不是重写的 URI 。%1是对前一个匹配项的反向引用,RewriteCond
而? 在重定向 URL 的末尾告诉RewriteRule
不要将查询字符串附加到末尾。