RedirectMatch-停止匹配首次出现的匹配项

时间:2018-10-07 22:12:28

标签: apache .htaccess mod-rewrite

我的重定向被第一次匹配而不是最接近的匹配。

请求网址:/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。

1 个答案:

答案 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次(*)。

对于查询字符串,RedirectMatchRedirect指令的特例。在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]

如果需要,使用括号和$1RewriteRule相同。