我的重定向被第一次匹配而不是最接近的匹配。
请求网址:/audios/3933
RedirectMatch 301 ^/audios/393/ /artists/a/1849
RedirectMatch 301 ^/audios/3933/ /artists/b/1850
它只匹配第一个规则,并且由于^
而有意义。但是,如何获取它以匹配URL中的完整ID。
请注意,在我不知道的数字后面有一些字符串。例如,URL可以是/audios/393/a
或/audios/3933/a
。
我该如何使用它?我在ubuntu上使用的是Apache 2.4。
答案 0 :(得分:1)
应该首先以限制性最强的匹配指定重定向(和重写)规则,然后以更宽松的规则(在配置文件中自上而下)进行指定。
在您的特定情况下,您提到数字后有一些字符串。因此,您可以像这样修改您的配置:
RedirectMatch 301 "^/audios/393/.*$" "/artists/a/1849"
RedirectMatch 301 "^/audios/3933/.*$" "/artists/b/1850"
如果您需要数字后的字符串,请使用以下配置:
RedirectMatch 301 "^/audios/393/(.*)$" "/artists/a/1849/$1"
RedirectMatch 301 "^/audios/3933/(.*)$" "/artists/b/1850/$1"
$1
将由括号分隔的字符串代替。 .*
的意思是“任何字符(.
),重复0到n次(*
)。
对于查询字符串,RedirectMatch
是Redirect
指令的特例。在Redirect
文档(https://httpd.apache.org/docs/2.4/mod/mod_alias.html#redirect)中,您可以阅读:
这包括带有GET参数的请求,例如 http://example.com/service/foo.pl?q=23&a=42,它将被重定向到 http://foo2.example.com/service/foo.pl?q=23&a=42。请注意,POST将 被丢弃。
的确,查询字符串是自动添加(GET)的。
如果您不想这样做,则可以使用RewriteRule
,并带有标志[QSD]
,因为您的目标URL不包含查询字符串。该标志不会将查询字符串添加到目标URL。
配置如下:
RewriteEngine On
RewriteRule "^/audios/393/.*$" "/artists/a/1849" [R=301,L,QSD]
RewriteRule "^/audios/3933/.*$" "/artists/b/1850" [R=301,L,QSD]
如果需要,使用括号和$1
与RewriteRule
相同。