我正在使用这些重写规则从动态网址转到静态网址。
RewriteEngine On
RewriteRule ^songs/album/([^/]*)\.html$ /index.html?album=$1 [L,QSA]
旧网址:http://example.com/index.html?album=rockstar 新网址:http://example.com/songs/album/rockstar.html
但是,如果我尝试将旧网址重定向到新网址,则无效
RedirectMatch 301 ^/index.html?album=(.*)\$ http://example.com/songs/album/$1.html
有什么想法吗?
答案 0 :(得分:0)
mod_alias中的RedirectMatch
指令与查询字符串不匹配,只与/index.html
部分匹配。您需要使用RewriteCond ${QUERY_STRING} <regexp>
来匹配它。但是如果你像这样重定向你会导致一个循环,因为URI是通过重写引擎,直到URI没有变化:
/songs/album/rockstar.html
并将其重写为/index.html?album=rockstar
/index.html?album=rockstar
如果实际请求是/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
中匹配的反向引用,重定向网址末尾的?告诉RewriteRule
不要将查询字符串附加到末尾。