我正在尝试将新闻通讯 URL 从本地服务器重定向到 Amazon S3 存储桶。
所以我想重定向自:
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 上的新子目录,它将不是重定向:
RewriteRule ^(/assets/img/newsletter/)(.+) https://s3.amazonaws.com/mybucket/newsletters/legacy/$2 [R=301,L]
但是如果我使用一个笼统的表达式来捕获整个文件路径将要重定向:
RewriteRule ^(.*)$ https://s3.amazonaws.com/mybucket/newsletters/legacy/$1 [R=301,L]
为什么它只适用于“匹配所有”表达式,而不适用于更具体的表达式?
答案1
由于您已经在第一个块中捕获了您感兴趣的 URI 部分RewriteCond
,因此您不必再次捕获它来执行RewriteRule
,并且由于您的两个RewriteCond
s 都已满足,因此无需第三次解析 URI,因此一个简单的插入符号就可以完成。
# 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
s 的匹配以 in 而%
不是 为前缀$
)。
它可能无法解释为什么你的RewriteRule
不匹配,因为在我看来它看起来没问题,但是使用这种方法,这是不必要的。
答案2
RewriteRule 有一些不需要的内容,这可能会导致这种行为。
尝试一下这个:
RewriteRule ^/assets/img/newsletter/(.+)$ https://s3.amazonaws.com/mybucket/newsletters/legacy/$1 [R=301,L]
在这里我使用“一个或多个”量词来表示正则表达式,这样 $1 在任何时候都不能为空。