Mod-Rewrite

RewriteRule 適用於“匹配一切”模式,但不適用於目錄模式

  • August 18, 2014

我正在嘗試將時事通訊 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]

為什麼它只適用於“匹配所有”表達式而不適用於更具體的表達式?

由於您已經在第一個RewriteCond塊中擷取了您感興趣的 URI 部分,因此您不必再次擷取它來執行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]

因此,這應該可以解決問題(來自 s 的匹配RewriteCond以 an 為前綴,%而不是$)。

它可能無法解釋為什麼您的RewriteRule不匹配,因為它對我來說看起來不錯,但是使用這種方法,它是不必要的。

引用自:https://serverfault.com/questions/622251