我试图将我的本地服务器的简报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在任何时候都不能为空。