RewriteRule 适用于“匹配所有内容”模式,但不适用于目录模式

RewriteRule 适用于“匹配所有内容”模式,但不适用于目录模式

我正在尝试将新闻通讯 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,并且由于您的两个RewriteConds 都已满足,因此无需第三次解析 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]

因此这应该可以解决问题(来自RewriteConds 的匹配以 in 而%不是 为前缀$)。

它可能无法解释为什么你的RewriteRule不匹配,因为在我看来它看起来没问题,但是使用这种方法,这是不必要的。

答案2

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

尝试一下这个:

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

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

相关内容