2

我正在使用这些重写规则从动态 url 到静态的。

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

有任何想法吗?

4

1 回答 1

0

mod_alias 中的RedirectMatch指令与查询字符串不匹配,仅匹配/index.html部分。您需要使用 aRewriteCond ${QUERY_STRING} <regexp>来匹配它。但是如果你像这样重定向,你将导致一个循环,因为 URI 会通过重写引擎,直到 URI 不变:

  1. 用户在其 URL 地址栏中键入http://example.com/index.html?album=rockstar
  2. 浏览器被重定向到http://example.com/songs/album/rockstar.html
  3. mod rewrite 看到/songs/album/rockstar.html并将其重写为/index.html?album=rockstar
  4. 重定向规则成功匹配/index.html?album=rockstar
  5. 从第 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不要将查询字符串附加到末尾。

于 2012-04-13T07:08:16.533 回答