重写规则适用于“匹配一切”模式,但不是目录模式

我试图将我的本地服务器的简报URLredirect到Amazon S3存储桶。

所以我想redirect从:

https://mysite.com/assets/img/newsletter/Jan12_Newsletter.html

至:

https://s3.amazonaws.com/mybucket/newsletters/legacy/Jan12_Newsletter.html

这是我的规则的第一部分:

 RewriteEngine On RewriteBase / # Is it in the newsletters directory RewriteCond %{REQUEST_URI} ^(/assets/img/newsletter/)(.+) [NC] # Is not a 2008-2011 newsletter RewriteCond %{REQUEST_URI} !(.+)(11|10|09|08)_Newsletter.html$ [NC] ## -> RewriteRule to S3 Here <- ## 

如果我使用这个RewriteRule指向S3上的新子目录,它不会redirect:

RewriteRule ^(/assets/img/newsletter/)(.+) https://s3.amazonaws.com/mybucket/newsletters/legacy/$2 [R=301,L]

但是,如果我使用一个expression式来捕获整个文件path,它将redirect:

RewriteRule ^(.*)$ https://s3.amazonaws.com/mybucket/newsletters/legacy/$1 [R=301,L]

为什么它只适用于“匹配所有”expression式,而不是一个更具体的expression式?

由于您捕获了您已经在第一个RewriteCond块中感兴趣的URI的一部分,因此您不必再捕获它来执行RewriteRule ,并且由于您的两个RewriteCond都符合,所以不需要parsingURI第三次,所以一个简单的脱字符就可以了。

 # Is it in the newsletters directory RewriteCond %{REQUEST_URI} ^/assets/img/newsletter/(.+) [NC] # Is not a 2008-2011 newsletter RewriteCond %{REQUEST_URI} !(?:11|10|09|08)_Newsletter.html$ [NC] RewriteRule ^ https://s3.amazonaws.com/mybucket/newsletters/legacy/%1 [R=301,L] 

因此,这应该做的伎俩(来自RewriteCond的匹配以%为前缀,而不是$ )。

它可能不会解释为什么你的RewriteRule不匹配,因为它对我来说看起来不错,但使用这种方法,它是unceccesary。

RewriteRule有一些不需要的东西,这可能会导致这种行为。

试试这个:

 RewriteRule ^/assets/img/newsletter/(.+)$ https://s3.amazonaws.com/mybucket/newsletters/legacy/$1 [R=301,L] 

这里我使用“一个或多个”量词来expression正则expression式,所以$ 1在任何时候都不能为空。